Как импортировать библиотеки или прелюдию в контекст, в котором работает GH C .runGh c - PullRequest
1 голос
/ 15 января 2020

Я пытаюсь вычислить некоторый динамический c код с помощью 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, нет доступных библиотек, даже прелюдии. Как бы я go об импорте библиотеки или прелюдии в этом контексте? Включение оператора import в GHC.dynCompileExpr просто приводит к ошибке разбора.

1 Ответ

3 голосов
/ 15 января 2020

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

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]

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

...