Search code examples
haskellstaticconstantsprecompiled

How to compile a resource into a binary in Haskell?


Say I have a dictionary.txt file, I need to read it into a map and use it in my program, how can I make this dictionary.txt file contained in the compiled exe file?


Solution

  • You can store serialized data types as bytestring literals. Here's an example:

    However, the file-embed automates this process, making it easier to do non-trivial embeddings.

    All approaches essentially boil down to representing the static data as a 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