为什么不能在提示中将顶级模块设置为 main

发布于 2024-11-30 12:00:46 字数 552 浏览 0 评论 0 原文

为什么不能在提示(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"

Why cannot top level module be set to "Main" in Hint (Language.Haskell.Interpreter)?

Allow me to demonstrate:

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

Will result in:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

π浅易 2024-12-07 12:00:46

作为 文档说,顶级模块必须被解释,即不被编译。

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

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

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

As the documentation says, top level modules have to be interpreted, i.e. not compiled.

When loading a module, a compiled version will be used if it's available. The GHCi manual has more detailed information on this.

I'm guessing there's a test.o and test.hi in the same folder from an earlier build. I was able to reproduce the error with these files present. Deleting them solves the problem, as the module will then be interpreted.

You can also force a module to be loaded in interpreted mode by prefixing the module name with an asterisk, e.g. loadModules ["*" ++ mname ++ ".hs"].

落花浅忆 2024-12-07 12:00:46

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

它使用 Main rel="nofollow">findModule,但是,显然,加载了错误的 Main:它正在加载应用程序 Main,它确实没有被解释,看见了,就死了。

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

It would appear that it compiles the code OK, but then when it goes back to load the current interpreted modules, a problem occurs.

It loads Main with findModule, but, apparently, loads the wrong Main: It's loading the application Main, which indeed was not interpreted, sees that, and dies.

(Though I should add I haven't used Hint so I'm kind of guessing ;)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文