2011-06-19 122 views

回答

12

可以將序列化數據類型存儲爲字節字符串。這裏有一個例子:

然而,file-embed自動執行此過程,使它更容易做不平凡的嵌入。

所有這些方法基本上可以歸結爲代表的靜態數據看作一個字節字符串,

{-# 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 
21

你必須拿出你自己的方式把它放到地圖中,但http://hackage.haskell.org/package/file-embed會將它放到你的編譯好的二進制文件中。我們使用它來在我們的一些Web應用程序中嵌入模板。

+0

自從它的模板以來,最終用戶不需要文件嵌入嗎? – alternative

+0

嵌入可執行文件有意義嗎? –

6

您可以使用自定義Makefile/Setup.hs掛鉤並調用windres(如果你使用的是Windows)或objcopy/elfrc(如果你是在Linux上)編譯資源COFF/ELF對象,你可以接着用結合你的Haskell對象文件形成最終的可執行文件。然後,您可以使用Haskell的FFI這樣的(未測試)訪問資源:

-- We have an image resource called "_imgdata" 
foreign import ccall "&" _imgdata :: CString 

-- Size of _imgdata is 405585 bytes. 
imgdata :: CStringLen 
imgdata = (_imgdata, 405585) 

這個解決方案會比使用file-embed更有效(不CString - >ByteString轉換回事),但也更復雜。另外,我還需要資源文件支持during my work on cabal-install,所以它可能會被集成到未來版本的Cabal(如果我將實現它)。

6

我強烈推薦你使用Template Haskell,加載該文件,並把它變成一個Haskell數據類型。它不僅會被編譯到最終的二進制文件中,而且會被完全優化。

相關問題