Haskell 有两个列表左折叠函数:foldl
,以及“严格”版本,foldl'
。不严格的问题foldl
是它建造了一座重击塔:
foldl (+) 0 [1..5]
--> ((((0 + 1) + 2) + 3) + 4) + 5
--> 15
这会浪费内存,并且如果列表中的项太多,可能会导致堆栈溢出。foldl'
另一方面,强制对每个项目使用累加器。
然而,据我所知,foldl'
is 语义上等价 to foldl
。评估foldl (+) 0 [1..5]
要达到正常形式,需要在某个时刻强制累加器。如果我们不需要头部正常形式,我们就不会评估foldl (+) 0 [1..5]
首先。
是否有任何令人信服的理由让人想要这样的行为foldl
超过了foldl'
?
foldl
and foldl'
语义上并不等价。简单的反例:
Prelude Data.List> foldl (\x y -> y) 0 [undefined, 1]
1
Prelude Data.List> foldl' (\x y -> y) 0 [undefined, 1]
*** Exception: Prelude.undefined
然而,在实践中,您通常需要严格的foldl'
由于你提到的原因。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)