今天我在编写一个小脚本时,我使用了foldl
而不是foldl'
。结果我遭受了stack overflow
,所以我导入了Data.List (foldl')
并对此感到高兴。这就是我使用foldl
的默认工作流程。当惰性版本无法求值时,只需使用foldl'
。
Real World Haskell
认为我们在大多数情况下应该使用foldl'
而不是foldl
。Foldr Foldl Foldl'说:
通常要在
foldr
和foldl'
之间进行选择。...
但是,如果组合函数在其第一个参数中是惰性的,则
foldl
可能会愉快地返回一个结果,而foldl'
则会出现异常。
下面是一个示例:
(?) :: Int -> Int -> Int
_ ? 0 = 0
x ? y = x*y
list :: [Int]
list = [2, 3, undefined, 5, 0]
okey = foldl (?) 1 list
boom = foldl' (?) 1 list
抱歉,但这是一个相当学术的例子,虽然很有趣。那么我想问,有没有foldl
实际应用的例子呢?我的意思是,在我们不能用foldl'
替换foldl
时。
附言:我知道,很难定义术语“实际”,但我希望您能理解我的意思。
另外,我理解为什么懒惰的foldl
是Haskell中的默认设置。我不要求任何人移山倒海并将严格版本作为默认设置。我只是对独占使用foldl
函数的示例真的很感兴趣 :)
最后,任何有趣的foldl
用法都欢迎。
undefined
,你还可以使用foldl
来避免可能昂贵的操作。如果你的折叠函数在成功操作后提前退出,则可以通过懒惰性避免执行昂贵的计算。可能有更清晰的写法(比如说单子),但是折叠对于编译器优化来说也很好用。 - bheklilr