GHCi - 第二次运行时跳过断点

3
我刚开始学习Haskell,���试时出现了一个令人烦恼的问题。
1. 我使用 :break 添加断点。 2. 运行 main。 3. 一切正常。 4. 我输入 :continue 结束执行。
当我重新运行 main 时,断点不再起作用,但是 :show breaks 列出了它。有人知道发生了什么吗?
我使用的是 Ubuntu 11.10 64位系统。明天我会在另一个环境下进行测试。
谢谢。

如果您发布使用的 GHCi 版本,可能会有所帮助。 - Thomas M. DuBuisson
2
没有看到代码很难确定,但听起来第二次运行主函数时断点没有被触发,因为由于惰性求值的缘故结果已经被缓存了。第一次可能是一个THUNK(一个挂起的求值),而第二次它已经被求值了。 - danr
@danr,你说得对,所有的输入都是常量,所以像你说的那样,在第一次运行后,所有的东西都必须被缓存。我可以重新加载模块,但不幸的是,它也会删除所有断点。写下答案,我会接受它。 - Robert Jakubowicz
2个回答

2

没有看到代码很难确定,但听起来第二次运行主函数时断点从未被触发,因为由于惰性求值的缘故结果已经被缓存。第一次可能是一个THUNK(暂停的计算),而第二次则已经被计算过了。


0
为了避免重复计算,常量应用表单被替换为指向其redex的间接引用。
例如,在以下代码片段中,“papperlap”的右侧将被替换为指向“4”的间接引用节点。
bla x = x + 1
papperlap = bla 3

如果您在“bla”上设置断点并两次请求“papperlap”,则会发现“bla”仅应用一次。但是,如果您两次请求“bla 3”,我们也将停止两次:
*Main> :break bla
Breakpoint 0 activated at meerbla.hs:1:1-13
*Main> papperlap
Stopped at meerbla.hs:1:1-13
_result :: a = _
[meerbla.hs:1:1-13] *Main> :continue
4
*Main> papperlap
4
*Main> bla 3
Stopped at meerbla.hs:1:1-13
_result :: a = _
[meerbla.hs:1:1-13] *Main> :continue
4
*Main> bla 3
Stopped at meerbla.hs:1:1-13
_result :: a = _
[meerbla.hs:1:1-13] *Main> :continue
4

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