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

Почему модуль верхнего уровня не может быть установлен на «Основной» в подсказке (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 ]

6 голосов
/ 21 августа 2011

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

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

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

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

0 голосов
/ 21 августа 2011

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

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

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

...