隨着GHC 8.0.2版下面的程序:兩個函數調用,但只有一個跟蹤顯示
import Debug.Trace
f=trace("f was called")$(+1)
main = do
print $ f 1
print $ f 2
輸出:
f was called
2
3
它是預期的行爲?如果是,爲什麼?我預計字符串f was called
要打印兩次,一次在2
之前,一次在3
之前打印一次。
對TIO相同的結果:Try it online!
編輯 但這個方案:
import Debug.Trace
f n=trace("f was called:"++show n)$n+1
main = do
print $ f 1
print $ f 2
輸出:
f was called:1
2
f was called:2
3
我懷疑這些行爲與懶惰有關,但我的問題依然存在:這是預期的行爲,如果是的話,爲什麼?
Hackage斷言此:
的跟蹤功能輸出給出作爲它的第一個參數 跟蹤消息,返回第二個參數作爲其結果之前。
我在第一個例子中沒有看到它。
EDIT 2基於@amalloy評論第三個例子:
import Debug.Trace
f n=trace "f was called"$n+1
main = do
print $ f 1
print $ f 2
輸出:
f was called
2
f was called
3
請注意,'trace'類型爲'String - > a - > a'。在'f ='情況下取代'a'的類型與'f n ='情況下的類型不同。這也應該有助於解釋不同的行爲。 –