ファイルがあるdictionary.txt
としましょう。それをマップに読み込んでプログラムで使用する必要があります。コンパイルされたexeファイルにこのdictionary.txtファイルを含めるにはどうすればよいですか。
4 に答える
マップに取り込むには独自の方法を考え出す必要がありますが、http://hackage.haskell.org/package/file-embedを使用すると、コンパイルされたバイナリに取り込まれます。一部のWebアプリケーションにテンプレートを埋め込むために使用します。
シリアル化されたデータ型をバイト文字列リテラルとして格納できます。次に例を示します。
- http://code.haskell.org/~dons/code/compiled-constants/
- http://haskell.org/haskellwiki/Compiling_in_constants
ただし、ファイル埋め込みはこのプロセスを自動化するため、重要な埋め込みを簡単に行うことができます。
すべてのアプローチは、基本的に静的データをバイト文字列リテラルとして表すことに要約されます。
{-# 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
カスタム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)
このソリューションは、ファイル埋め込みを使用するよりも効率的です(CString
->ByteString
変換は実行されません)が、より複雑になります。
余談ですが、cabal-installの作業中にリソースファイルのサポートが必要になることもありました。そのため、おそらく将来のバージョンのCabalに統合される予定です(実装する場合)。
ここでテンプレートHaskellを使用して、ファイルをロードし、Haskellデータ型に変換することを強くお勧めします。最終的なバイナリにコンパイルされるだけでなく、完全に最適化されます。