我想读取一个外部 Haskell 源文件以进行编译时 AST 操作。我怎样才能做到这一点?我尝试了类似以下的方法,但编译时出现错误消息“TH.hs:15:12:声明括号内不允许声明拼接”。
--------
-- TH.hs
{-# LANGUAGE TemplateHaskell, QuasiQuotes #-}
module TH where
import Language.Haskell.TH
import Language.Haskell.TH.Quote
dd :: QuasiQuoter
dd = QuasiQuoter undefined undefined undefined ddDec
ddDec file_name = do
file_cts <- runIO (readFile file_name)
-- runQ [d| dummy = 0 |] -- This can compile.
runQ [d| file_cts |] -- This does not compile.
--------
-- main.hs
{-# LANGUAGE TemplateHaskell, QuasiQuotes #-}
import Language.Haskell.TH
import Language.Haskell.TH.Quote
import TH
[dd|input.hs|]
--------
-- input.hs
test = putStrLn "Hello."
--------
我也尝试过 haskell-src-exts 包,但是这个包似乎只解析并且不解析标识符和类型检查。所以我认为TH是一个更好的选择。