2012-01-29 49 views
2

我是Haskell的新手,在调试时遇到了一个令人讨厌的行为。GHCi - 第二次跳过断点

  1. 我添加使用我的断点:打破
  2. 我经营的主要
  3. 一切正常
  4. I型:继续完成执行

当我重新运行为主,断点没有再打,但断点没有被删除,因为:show break列出了它。任何人都知道发生了什么事?

我在Ubuntu 11.10,64位。我明天会在不同的环境中测试它。

感谢

+0

如果你发布了正在使用的GHCi的版本,这可能会有所帮助。 – 2012-01-29 18:41:02

+2

在看不到代码的情况下很难知道,但听起来很有可能主断点的第二次运行永远不会到达,因为结果由于惰性评估而被缓存。这可能是第一次THUNK(暂停评估),而第二次它已经被评估。 – danr 2012-01-29 18:42:20

+0

@danr,你说得对,所有的输入都是恒定的,所以你必须在第一次运行后缓存所有内容。我可以重新加载模块,但不幸的是它也删除了所有的断点。写出答案,我会接受它。 – 2012-01-29 21:19:10

回答

2

很难知道没有看到代码,但它听起来可能是在主断点的第二次运行永远达不到,因为结果是因为懒的评价缓存。这可能是第一次THUNK(暂停评估),而第二次它已经被评估。

0

为了避免重新计算,常量应用程序表单被间接替换为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