这是自定义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)
不会被严格评估,但是 instad Haskell 会创建一个 thunk,对吗?
这是防止创建 thunk 的正确方法,从而强制对(n+1)
?
length3 = length3' 0 where
length3' n [] = n
length3' n (x:xs) = length3' (n+1) $! xs
我将如何使用seq
而不是达到相同的效果$!
?