如何将库或前奏导入 GHC.runGhc 运行的上下文中

How to import libraries or the prelude into the context in which GHC.runGhc runs

我正在尝试使用 GHC.dynCompileExpr 评估一些动态代码,如下所示。

module Main where

import Data.Dynamic
import GHC
import GHC.Paths as GHP
import GHC.Types
import GHC.Prim
import GHC.Num

main :: IO ()
main = do
  dynval <- GHC.runGhc (Just GHP.libdir) $ do
    setSessionDynFlags =<< getSessionDynFlags
    GHC.dynCompileExpr "[3,2,4,0]::Integer"
  let val = fromDynamic dynval :: Maybe [Integer]
  putStrLn $ show val

然而,当我 运行 它时,它失败并出现错误:不在范围内:类型构造函数或 class ‘Integer’。好像在GHC.dynCompileExpr运行s的上下文中,没有可用的库,连前奏都没有。我将如何着手将库或序曲导入到此上下文中?在 GHC.dynCompileExpr 中包含 import 语句只会导致解析错误。

这花了我一段时间才弄清楚,但我似乎找到了让它工作的方法。

module Main where

import Data.Dynamic
import GHC
import GHC.Paths ( libdir )
import GHC.Types
import GHC.Prim
import GHC.Num
import DynFlags

main :: IO ()
main = do
  dynval <- GHC.runGhc (Just libdir) $ do
    dflags <- getSessionDynFlags
    setSessionDynFlags dflags
    setContext [ IIDecl $ simpleImportDecl (mkModuleName "Prelude") ]
    GHC.dynCompileExpr "[3, 2, 1, 0] :: [Prelude.Integer]"
  let val = fromDynamic dynval :: Maybe [Integer]
  putStrLn $ show val

解决方案似乎在以下行中:

setContext [ IIDecl $ simpleImportDecl (mkModuleName "Prelude") ]

这将 Prelude 带入上下文,表达式被正确计算,给出输出:

Just [3,2,1,0]

我从 here 那里得到了这段代码。希望对您有所帮助!