Использование GH C .runGh c завершается ошибкой: «Не удалось загрузить интерфейс для« GH C .Types », не найден идентификатор устройства, соответствующий« gh c -prim »» - PullRequest
0 голосов
/ 13 января 2020

У меня есть следующий код, который пытается скомпилировать и напечатать простое выражение во время выполнения, вызвав GH C 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 происходит сбой с ошибкой во время выполнения:

Не удалось загрузить интерфейс для 'GH C .Types'

нет идентификатора устройства, соответствующего 'gh c -prim 'был найден

Что мне нужно сделать, чтобы избежать этой ошибки?

Я пробовал с GH C 8.6 и 8.8, и оба столкнулись с проблемой. Я запускаю его в новом стековом проекте с установленными только ghc, ghc-prim и ghc-paths.

1 Ответ

1 голос
/ 14 января 2020

Вам нужно позвонить 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.

...