gpt4 book ai didi

Haskell - Foldl 和 Foldr?

转载 作者:行者123 更新时间:2023-12-02 06:58:18 27 4
gpt4 key购买 nike

foldlfoldr 之间的区别只是循环的方向吗?我认为他们所做的事情有所不同,而不仅仅是方向不同?

最佳答案

如果您的函数不具有关联性(即,用括号括起表达式的方式很重要),则存在差异,例如,
foldr (-) 0 [1..10] = -5但是foldl (-) 0 [1..10] = -55 .
这是因为前者等于 1-(2-(3-(4-(5-(6-(7-(8-(9-(10 - 0))))))))) ,而后者是 (((((((((0-1)-2)-3)-4)-5)-6)-7)-8)-9)-10 .

因为(+)是关联的(与添加子表达式的顺序无关),
foldr (+) 0 [1..10] = 55foldl (+) 0 [1..10] = 55(++)是另一个关联运算,因为 xs ++ (ys ++ zs)给出与 (xs ++ ys) ++ zs 相同的答案(尽管第一个更快 - 不要使用 foldl (++) )。

某些功能只能以一种方式工作:
foldr (:) :: [a] -> [a] -> [a]但是foldl (:)简直是废话。

看看 Cale Gibbard 的图表(来自 wikipedia article );你可以看到f使用真正不同的数据对进行调用:
foldr foldl

另一个区别是,因为它匹配列表的结构,foldr对于惰性评估通常更有效,因此可以与无限列表一起使用,只要 f第二个参数是非严格的(如 (:)(++) )。 foldl很少是更好的选择。如果您使用foldl通常值得使用foldl'因为它很严格,会阻止您建立一长串中间结果。 (有关此主题的更多信息,请参阅 this question 的答案。)

关于Haskell - Foldl 和 Foldr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13280159/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com