haskell - 使用 GHC.runGhc 失败并出现错误:“无法为 'GHC.Types' 加载接口,找不到与 'ghc-prim' 匹配的单元 ID”
问题描述
我有以下代码,它试图通过调用 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”加载接口失败</p>
找不到与“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
。
推荐阅读
- php - 创建表 - phpword
- python - 在 isnull().any(axis=1) 上重新索引的布尔键
- junit4 - 静态导入如何为空
- google-bigquery - BigQuery - 从非分区表转换为分区表 - 旧版 SQL
- java - Java 从 XML 网站获取数据到 SQL 数据库
- vue.js - 使用 Vue CLI 热重载 scss?
- reactjs - 带有 React 的 SignalR 不是很实时
- c++ - 多字符字符常量变量的值是多少
- android - 如何调整按钮中图标的大小和颜色?
- xamarin - 后台服务位置已更改未触发 Xamarin Android