基本上当我:load name.hs
的变量和绑定都消失了。
是否有一些选项可以告诉 ghci 保留所有内容?
要加载新模块,您可以使用
Prelude> :m + Mymodule
但是重新加载和保持交互式绑定通常是不可能的。重新加载本质上是忘记所有模块并再次加载它们。绑定可能取决于已加载的模块。依赖逻辑规定,当 GHCI 忘记一个模块时,它还需要忘记依赖它的所有内容,包括交互式绑定。
例如,GHCI 可以存储用于创建绑定的命令文本,并尝试在重新加载时重新运行这些命令,因为知道其中一些命令可能会失败。但这很快就会变得毛茸茸,所以没有完成。
我正在添加另一个答案,因为这个问题是谷歌第一次为我点击,而真正的解决方案则更远(我只是没有检查其余的点击,只是因为 IRC 上有帮助的人我找到了它):
http://chrisdone.com/posts/ghci-reload
基本上,它是一个库,允许您将数据保存在一个稳定的指针下,下面有一些 C 代码,可以在 GHCi 重新加载后幸存下来。
该博文中给出的示例相当复杂,对于只想在 GHCi 会话中准备好一些数据的人来说,库本身的 README 更好:
https://github.com/chrisdone/foreign-store/blob/master/README.md
它为我节省了很多时间,但我的场景很简单:我想在操作其余代码时加载并准备好一些资产。这些资产的类型和结构根本没有改变。
我不认为这可以用 GHCi 完成。
谷歌搜索,我发现一个自述文件指出:重新加载维护的变量,但保持绑定对我不起作用:
*Main> let x = 1
*Main> :show bindings
x :: forall t. (Num t) => t = _
*Main> x
1
*Main> :reload
Ok, modules loaded: Main.
*Main> :show bindings
*Main> x
<interactive>:1:0: Not in scope: `x'