Как импортировать библиотеки или прелюдию в контекст, в котором работает GHC.runGhc

Я пытаюсь оценить динамический код с помощью GHC.dynCompileExpr , как 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

Однако, когда я запускаю его, он завершается с ошибкой: не в области видимости: конструктор типа или класс 'Integer' . Кажется, в контексте, в котором работает GHC.dynCompileExpr , нет доступных библиотек, даже прелюдии. Как мне импортировать библиотеку или прелюдию в этот контекст? Включение оператора import в GHC.dynCompileExpr просто приводит к ошибке разбора.

Всего 1 ответ


мне потребовалось некоторое время, чтобы понять, но я, кажется, нашел способ заставить его работать.

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]

Я получил этот код отсюда . Надеюсь, это поможет!


Есть идеи?

10000