在编译时通过文件内容初始化函数
Initialize function by file contents at compile time
有没有办法初始化一个函数
someText :: Text
哪个值将存储在编译时可用的文件中?
我以为我可以用 TH,但现在我只是 found
embedFile :: FilePath -> Q Exp
runQ :: Quasi m => Q a -> m a
我只能将Q
展开为IO
:
instance Quasi IO
instance Quasi Q
我想我需要 Quasi 的 Identity
个实例,但是没有。
这不就是
someText :: Text
someText = $(embedStringFile "path/to/file")
我是不是漏掉了什么?
(是 TH 拼接本身在 运行 时将 Q Exp
转换为其他类型。您不需要任何类型类实例或任何东西...)
# foo.txt
barbazblub
module FileText where
import Language.Haskell.TH
fileText :: FilePath -> Q Exp
fileText fp = LitE . StringL <$> runIO (readFile fp)
{-# LANGUAGE TemplateHaskell #-}
module Foo where
import FileText
main = putStrLn $(fileText "foo.txt")
$ runhaskell Foo.hs
barbazblub
有没有办法初始化一个函数
someText :: Text
哪个值将存储在编译时可用的文件中?
我以为我可以用 TH,但现在我只是 found
embedFile :: FilePath -> Q Exp
runQ :: Quasi m => Q a -> m a
我只能将Q
展开为IO
:
instance Quasi IO
instance Quasi Q
我想我需要 Quasi 的 Identity
个实例,但是没有。
这不就是
someText :: Text
someText = $(embedStringFile "path/to/file")
我是不是漏掉了什么?
(是 TH 拼接本身在 运行 时将 Q Exp
转换为其他类型。您不需要任何类型类实例或任何东西...)
# foo.txt
barbazblub
module FileText where
import Language.Haskell.TH
fileText :: FilePath -> Q Exp
fileText fp = LitE . StringL <$> runIO (readFile fp)
{-# LANGUAGE TemplateHaskell #-}
module Foo where
import FileText
main = putStrLn $(fileText "foo.txt")
$ runhaskell Foo.hs
barbazblub