Почему модуль верхнего уровня не может быть установлен на основной в подсказке

Почему модуль верхнего уровня не может быть установлен на "Основной" в подсказке (Language.Haskell.Interpreter)?

Позвольте мне продемонстрировать:

module Main where

import Language.Haskell.Interpreter
import Control.Monad

main = do 
  res <- runInterpreter (test "test")
  case res of
       Left e -> putStrLn (show e)
       Right t -> putStrLn (show t) 
  return ()

test :: String -> Interpreter ()
test mname = 
  do
    loadModules [mname ++ ".hs"]
    setTopLevelModules ["Main"]

Приведет к:

NotAllowed "These modules are not interpreted:\nMain\n"

2 ответа

Решение

Как сказано в документации, модули верхнего уровня должны интерпретироваться, то есть не компилироваться.

При загрузке модуля будет использоваться скомпилированная версия, если она доступна. Руководство GHCi содержит более подробную информацию об этом.

Я предполагаю, что есть test.o а также test.hi в той же папке из более ранней сборки. Я смог воспроизвести ошибку с этими файлами. Удаление их решает проблему, так как модуль будет интерпретироваться.

Вы также можете принудительно загрузить модуль в интерпретированном режиме, поставив перед именем модуля звездочку, например: loadModules ["*" ++ mname ++ ".hs"],

Казалось бы, он компилирует код в порядке, но затем, когда он возвращается для загрузки текущих интерпретируемых модулей, возникает проблема.

Загружает Main с findModule, но, видимо, загружает неправильно Main: Загружается приложение Mainкоторый действительно не был истолкован, видит это и умирает.

(Хотя я должен добавить, что я не использовал подсказку, так что я немного догадываюсь;)

Другие вопросы по тегам