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:
- http://code.haskell.org/~dons/code/compiled-constants/
- http://haskell.org/haskellwiki/Compiling_in_constants
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.