這裏的評價是一個自定義length
功能的經典第一次嘗試:嚴格整數蓄電池
length1 [] = 0
length1 (x:xs) = 1 + length1 xs
,這裏是一尾遞歸版本:
length2 = length2' 0 where
length2' n [] = n
length2' n (x:xs) = length2' (n+1) xs
然而,(n+1)
不會evaluted嚴格來說,Haskell會創建一個thunk,對嗎?
這是防止創建thunk的正確方法,從而迫使嚴格評估(n+1)
?
length3 = length3' 0 where
length3' n [] = n
length3' n (x:xs) = length3' (n+1) $! xs
我將如何實現與seq
代替$!
同樣的效果?
如果你打開優化,你不必做任何事情,因爲嚴格分析可以確定'n'中的定義是嚴格的。 – augustss
@augustss哦,我不知道。謝謝! – fredoverflow
這就是說,嚴格信息發生的具體情況取決於類型。如果你使用'Int',它肯定會起作用。 – augustss