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

Haskell GHCi-在第二次运行时跳过断点,haskell,ghci,Haskell,Ghci,我是Haskell的新手,调试时会有令人讨厌的行为 我使用:break添加断点 我跑主干道 一切都好 I类型:继续完成执行 当我重新运行main时,断点不再命中,但断点没有被删除,因为:show breaks列出了它。有人知道发生了什么吗 我使用的是Ubuntu 11.10,64位。明天我将在不同的环境中测试它 谢谢如果看不到代码就很难知道,但是听起来很可能在第二次运行main时从未到达断点,因为由于延迟计算,结果被缓存了。第一次可能是THUNK(暂停评估),第二次可能已经评估。为避免重新计算,

我是Haskell的新手,调试时会有令人讨厌的行为

  • 我使用:break添加断点
  • 我跑主干道
  • 一切都好
  • I类型:继续完成执行
  • 当我重新运行main时,断点不再命中,但断点没有被删除,因为:show breaks列出了它。有人知道发生了什么吗

    我使用的是Ubuntu 11.10,64位。明天我将在不同的环境中测试它


    谢谢

    如果看不到代码就很难知道,但是听起来很可能在第二次运行main时从未到达断点,因为由于延迟计算,结果被缓存了。第一次可能是THUNK(暂停评估),第二次可能已经评估。

    为避免重新计算,将常量申请表替换为其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
    

    如果您发布正在使用的GHCi版本,这可能会有所帮助。如果不看到代码,很难知道,但是在main的第二次运行中,似乎从未达到断点,因为由于延迟计算,结果被缓存。第一次可能是THUNK(挂起的计算),第二次已经计算过。@danr,你说得对,所有输入都是常量,所以正如你所说的,在第一次运行后,所有内容都必须缓存。我可以重新加载模块,但不幸的是,它也删除了所有断点。写下答案,我会接受的。