如何在GHCi重载之间保持环境?

时间:2011-09-15 08:45:47

标签: haskell environment ghci

基本上当我:load name.hs变量和绑定消失时。

是否有一些选择告诉ghci保留所有内容?

3 个答案:

答案 0 :(得分:4)

要加载新模块,您可以使用

Prelude> :m + Mymodule

但通常不可能重新加载和保持交互式绑定。重新加载基本上忘记了所有模块并再次加载它们。绑定可能取决于已加载的模块。依赖逻辑规定当GHCI忘记模块时,它还需要忘记依赖于它的所有内容,包括交互式绑定。

GHCI可以例如存储用于创建绑定的命令文本,并尝试在重新加载时重新运行这些命令,因为知道其中一些命令可能会失败。但是这很快就会变得毛茸茸,所以它还没有完成。

答案 1 :(得分:4)

我正在添加另一个答案,因为这个问题首先是针对我的谷歌,而真正的解决方案是更远的(我只是没有检查其余的点击,只是因为有用的人在IRC我找到了):

http://chrisdone.com/posts/ghci-reload

基本上,它的库允许您将数据保存在一个稳定的指针下,其中一些C代码位于GHCi重新加载之后。

该博客文章中给出的示例相当复杂,对于想要在GHCi会话中准备好一些数据的人来说,来自库本身的README更好:

https://github.com/chrisdone/foreign-store/blob/master/README.md

它节省了我很多时间,但我的方案很简单:我想在操作剩下的代码时加载一些资产并准备就绪。这些资产的类型和结构根本没有变化。

答案 2 :(得分:2)

我不认为GHCi可以做到这一点。

谷歌搜索,我发现a readme表明:重新加载维护变量,但保持绑定对我不起作用:

*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'