如何在ghci中重新加载文件而不修改源代码?

3

我正在使用ghc-8.10.2。当我将一个源文件(其中包含许多顶层绑定和一个主函数,没有module声明)编译成可执行文件时,然后键入ghci以使用ghc的解释器,使用:load filename命令加载源文件。我发现在ghci环境中只有main顶级绑定是可见的,其他顶级绑定可以被引用,除非我对源文件进行了一些无意义的修改,然后重新加载它。我尝试重新加载源文件而不对其进行更改,甚至使用:reload命令,但它不起作用,因此我想问是否有一个命令可以随时强制重新加载模块。


可能需要使用 :set -fno-object-code 然后执行 :reload 命令?如果不行,也许可以通过一些技巧来让它在错误的位置查找目标代码。 - Daniel Wagner
另一个尝试的方法是 :m *Main(或者文件名中模块的名称)。关键点在于 * - Daniel Wagner
使用文件名重新加载模块的“:reload”命令无法正常工作。 - 叶芝秋
:set -fno-object-code 会输出信息 一些标志没有被识别:-fno-object-code,而我之前尝试过 :set -fbyte-code,虽然能够被识别但是无效。 - 叶芝秋
我按照ghci的提示信息:“模块'Main'未被解释;请先尝试':add *Main'”来尝试:add *Main,但它告诉我<no location info>: error: module ��main:Main�� is defined in multiple files: parser.hs parser.hs Failed, one module loaded. - 叶芝秋
你也可以通过创建一个别名(alias)的方式来“hack”它,使用 :!touch 命令创建文件并使用 :reload 命令重新加载它。 - luqui
2个回答

0

最多到Haskell报告

允许使用仅包含模块主体的缩写形式。如果使用了这种形式,则假定头部为“module Main(main)where”。

这意味着,如果您不使用module声明,默认情况下只从中导出main函数。这就是为什么您只能加载这样的函数。如果要避免这种情况,请从以下内容开始您的文件:

module Main where
...

0

:r 应该就可以了,而不是其他人似乎使用的 :reload


":r" 相当于 ":reload"。更确切地说,所有以冒号开头的命令都可以任意缩短,只要不会产生歧义,即使有歧义也会选择第一个字母匹配。因此,":r"、":re"、":rel"、":relo"、":reloa" 和 ":reload" 都是一样的。 - leftaroundabout

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接