2012-01-29 88 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