我有以下代码,它尝试通过调用 GHC API 在运行时编译和打印一个简单的表达式:
module Main where
import GHC
import GHC.Paths as GHP
import GHC.Types
import GHC.Prim
main :: IO ()
main = do
val <- GHC.runGhc (Just GHP.libdir) $ GHC.compileExpr "HelloWorld"
putStrLn $ show val
当我尝试通过首次编译或直接在 GHCI 中运行它时,它失败并出现运行时错误:
无法加载"GHC"的接口。类型'
未找到与"GHC-prim"匹配的设备 ID
我需要做什么来避免此错误?
我尝试过使用 GHC 8.6 和 8.8,都遇到了问题。我在一个新的堆栈项目中运行它,只安装了ghc
、ghc-prim
和ghc-paths
。
您需要调用setSessionDynFlags
来读取包数据库。 如果将main
的定义修改为:
main = do
val <- GHC.runGhc (Just GHP.libdir) $ do
setSessionDynFlags =<< getSessionDynFlags
GHC.compileExpr "HelloWorld"
putStrLn $ show val
然后它会生成异常:
Data constructor not in scope: HelloWorld
我想,这就是您期望尝试编译表达式HelloWorld
.