我是Haskell的新手,在调试时遇到了一个令人讨厌的行为。GHCi - 第二次跳过断点
- 我添加使用我的断点:打破
- 我经营的主要
- 一切正常
- I型:继续完成执行
当我重新运行为主,断点没有再打,但断点没有被删除,因为:show break列出了它。任何人都知道发生了什么事?
我在Ubuntu 11.10,64位。我明天会在不同的环境中测试它。
感谢
我是Haskell的新手,在调试时遇到了一个令人讨厌的行为。GHCi - 第二次跳过断点
当我重新运行为主,断点没有再打,但断点没有被删除,因为:show break列出了它。任何人都知道发生了什么事?
我在Ubuntu 11.10,64位。我明天会在不同的环境中测试它。
感谢
很难知道没有看到代码,但它听起来可能是在主断点的第二次运行永远达不到,因为结果是因为懒的评价缓存。这可能是第一次THUNK(暂停评估),而第二次它已经被评估。
为了避免重新计算,常量应用程序表单被间接替换为redex。
例如,'papperlap'的右侧将被替换为指向'4'的间接节点。
bla x = x + 1
papperlap = bla 3
。如果设置“BLA”断点,并要求“papperlap”两次,你会看到,“喇嘛”应用一次。但是如果你问两次'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
如果你发布了正在使用的GHCi的版本,这可能会有所帮助。 – 2012-01-29 18:41:02
在看不到代码的情况下很难知道,但听起来很有可能主断点的第二次运行永远不会到达,因为结果由于惰性评估而被缓存。这可能是第一次THUNK(暂停评估),而第二次它已经被评估。 – danr 2012-01-29 18:42:20
@danr,你说得对,所有的输入都是恒定的,所以你必须在第一次运行后缓存所有内容。我可以重新加载模块,但不幸的是它也删除了所有的断点。写出答案,我会接受它。 – 2012-01-29 21:19:10