我是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