simbolos peta pattern para opciones hacer español entornos ejemplos desarrollo como haskell static constants precompiled

pattern - peta haskell en español



¿Cómo compilar un recurso en un binario en Haskell? (4)

Puede almacenar tipos de datos serializados como literales de prueba. Aquí hay un ejemplo:

Sin embargo, el file-embed automatiza este proceso, facilitando la realización de incrustaciones no triviales.

Todos los enfoques esencialmente se reducen a representar los datos estáticos como un bytestring literal,

{-# LANGUAGE OverloadedStrings #-} import Data.Binary import qualified Data.Map as M import qualified Data.ByteString.Char8 as S import Data.ByteString.Lazy import Codec.Compression.GZip -- -- this is a gzip compressed literal bytestring, storing a binary-encoded Data.Map -- mytable = "/US/139/b/NUL/NUL/NUL/NUL/NUL/NUL/ETXEN/ //219/SO/194 /f/197/224/188/196/CAN/227/US/ //224/171~/NAKc/GS4ce/161`/178/191/215(/176/ //190/180/167/231/210/n/241/171/203/191/ti/ //157/217/149/249< /ENQ/214/&9>/202/162/179a/ //132X/233/ESC=/231/215/164/SYN/157/DC2D/226*/ //146/174o/t/167/DLE/209/"i_/240/193/129/199<W/ //250nC/CAN/212/CAN/162J/160/141C/178/133/216;/ ///@4/144-W/203/209x/205/140/166/RS/163/237]9f/ //170/143/ACK/163g/223/STX/184/&7/rH/222/FSW/ //130/&7D/197/NUL/164/&0U/193/186/t/186o/ //228/180~/NUL/a6/249/137#/SOH/NUL/NUL" main = print =<< M.lookup "ghc" m where -- build the table from the bytestring: m :: M.Map String (Maybe String) m = decode . decompress . fromChunks . return $ mytable

Digamos que tengo un archivo dictionary.txt , necesito leerlo en un mapa y usarlo en mi programa, ¿cómo puedo hacer este archivo dictionary.txt contenido en el archivo compilado exe?


Puede usar un gancho Makefile / Setup.hs e invocar windres (si está en Windows) u objcopy / elfrc (si está en Linux) para compilar recursos en objetos COFF / ELF que luego puede combinar con su Haskell Objetos para formar el ejecutable final. A continuación, puede acceder a los recursos utilizando Haskell FFI de esta manera (no probado):

-- We have an image resource called "_imgdata" foreign import ccall "&" _imgdata :: CString -- Size of _imgdata is 405585 bytes. imgdata :: CStringLen imgdata = (_imgdata, 405585)

Esta solución será más eficiente que el uso file-embed (no se ByteString conversiones de CString -> ByteString ), pero también ByteString más complicado.

Como nota aparte, también terminé necesitando soporte de archivos de recursos durante mi trabajo en cabal-install , por lo que probablemente se integrará en alguna versión futura de Cabal (si lo implemento).


Recomendaría encarecidamente utilizar la plantilla Haskell aquí, para cargar el archivo y convertirlo en un tipo de datos Haskell. No solo se compilará en el binario final, sino que también se optimizará por completo.


Tendrá que encontrar su propia manera de incluirlo en un Mapa, pero file-embed incluirá en su binario compilado. Lo usamos para insertar plantillas en algunas de nuestras aplicaciones web.