在编译时通过文件内容初始化函数

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

我想我需要 QuasiIdentity 个实例,但是没有。

这不就是

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