2

为什么不能在 Hint (Language.Haskell.Interpreter) 中将顶级模块设置为“Main”?

请允许我演示一下:

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"
4

2 回答 2

6

正如文档所说,必须解释顶级模块,即不编译。

加载模块时,如果可用,将使用已编译的版本。GHCi 手册对此有更详细的信息。

我猜在早期版本的同一个文件夹中有一个test.oand 。test.hi我能够在这些文件存在的情况下重现错误。删除它们可以解决问题,因为模块将被解释。

您还可以通过在模块名称前加上星号来强制以解释模式加载模块,例如loadModules ["*" ++ mname ++ ".hs"].

于 2011-08-20T21:11:36.977 回答
0

看起来它可以编译代码,但是当它返回加载当前解释的模块时,就会出现问题。

它加载MainfindModule,但显然加载了错误Main:它正在加载应用程序Main,它确实没有被解释,看到了,然后死了。

(虽然我应该补充一点,但我没有使用过提示,所以我有点猜测;)

于 2011-08-20T20:59:18.243 回答