我有以下代码,该代码通过调用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.Types”的界面
找不到与“ 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
所期望的。