【发布时间】:2014-09-19 20:42:00
【问题描述】:
今天在编写一个小脚本时,我使用了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 时。
P。 S. 我知道,很难定义术语 practical,但我希望你能明白我的意思。
P。 PS我明白了,为什么懒惰foldl在haskell中是默认的。我不要求任何人搬山并默认使用严格的版本。我只是对foldl 函数的独占使用示例非常感兴趣:)
P。 P.P.S. 好吧,欢迎使用 foldl 的任何有趣用法。
【问题讨论】:
-
除了避免
undefined,您还可以使用foldl来避免潜在的昂贵操作。如果您的折叠函数在成功操作时提前退出,那么您可以避免通过惰性执行昂贵的计算。可能有更清晰的方法来编写它(想到monoids),但折叠对于编译器优化可能很好。 -
是的,我正在考虑这个问题。但无法想象这样一个功能的好例子。