Почему модуль верхнего уровня не может быть установлен на основной в подсказке
Почему модуль верхнего уровня не может быть установлен на "Основной" в подсказке (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
который действительно не был истолкован, видит это и умирает.
(Хотя я должен добавить, что я не использовал подсказку, так что я немного догадываюсь;)