这里的评价是一个自定义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