首页 > 解决方案 > 使用 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-primghc-paths已安装。

标签: haskellghc

解决方案


您需要调用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


推荐阅读