Haskell有两个用于列表的左折叠函数:foldl
和一个“严格”版本foldl'
。非严格的foldl
的问题在于它会构建一个thunk的堆栈:
foldl (+) 0 [1..5]
--> ((((0 + 1) + 2) + 3) + 4) + 5
--> 15
这种方式会浪费内存,如果列表中的项太多可能会导致堆栈溢出。另一方面,foldl'
在每个项上强制执行累加器。
然而,据我所知,foldl'
在语义上等价于foldl
。将foldl (+) 0 [1..5]
求解为头范式需要在某个点上强制使用累加器。如果我们不需要一个头范式,那么我们根本不需要开始计算foldl (+) 0 [1..5]
。
是否有任何令人信服的理由使得foldl
的行为优于foldl'
?
foldl (.) id functions
而不是foldr (.) id functions
。它们在语义上是等价的,只有当前者不是_|_
时,后者才允许惰性消耗函数。我错了吗? - luqui(\x acc -> x . acc)
,这基本上意味着:首先执行最右边的函数,从而禁止了惰性消耗。我错了吗? :) - Dan Burtonfoldr
允许惰性消耗(考虑foldr (.) id [(string++) | string <- strings]
)。现在你提到了它,我也不知道为什么要使用foldl
(.) id函数。 - Daniel Fischerf (g x)
只是先执行g
。实际上,f
有第一次产生信息的机会。考虑f x = 1:x
;g x = g x
。 - luqui