gpt4 book ai didi

haskell - 是否有任何原因导致foldr 类型签名与foldl 类型签名不同?

转载 作者:行者123 更新时间:2023-12-02 15:02:04 25 4
gpt4 key购买 nike

与foldr相比,我对foldl的定义有点困惑。 Foldr 与 Foldl 的不同之处不仅在于关联性,还在于折叠函数参数顺序:

foldr :: (a -> b -> b) -> b -> [a] -> b
foldl :: (b -> a -> b) -> b -> [a] -> b

我看不出有什么理由不能这样定义foldl:

foldl :: (a -> b -> b) -> b -> [a] -> b
foldl f acc [] = acc
foldl f acc (x:xs) = foldl f (f x acc) xs

因此,foldl 可以应用于非交换折叠函数以及文件夹:

Prelude> foldr (:) [] [1..5]
[1,2,3,4,5]
Prelude> foldl (:) [] [1..5]
<interactive>:4:7: error:
<...>
Prelude> myfoldl (:) [] [1..5]
[5,4,3,2,1]

使用标准的foldl定义,我们需要使用flip来获得与foldr相同的行为

最佳答案

按照该顺序,您将获得以下很好的方程属性:

foldl (+) z [a, b, c] = (((z + a) + b) + c)
foldr (+) z [a, b, c] = a + (b + (c + z))

关于haskell - 是否有任何原因导致foldr 类型签名与foldl 类型签名不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52613180/

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