作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道为什么 fold left 期望的函数有类型签名 a -> b -> a
而不是 b -> a -> a
.这背后是否有设计决策?
例如,在 Haskell 中,我必须写 foldl (\xs x -> x:xs) [] xs
反转列表而不是较短的 foldl (:) [] xs
(这将是可能的 b -> a -> a
)。另一方面,有些用例需要标准 a -> b -> a
.在 Scala 中,可以附加:xs.foldLeft(List.empty[Int]) ((xs, x) => xs:+x)
可以写成xs.foldLeft(List.empty[Int]) (_:+_)
.
是否相应地出现更多的用例需要给定类型签名而不是替代类型签名,或者是否有其他决定导致在 Haskell 和 Scala(可能还有许多其他语言)中进行左折叠的设计?
最佳答案
从概念上讲,右折叠,比如 foldr f z [1..4]
替换以下形式的列表
:
/ \
1 :
/ \
2 :
/ \
3 :
/ \
4 []
f
/ \
1 f
/ \
2 f
/ \
3 f
/ \
4 z
(1 `f` (2 `f` (3 `f` (4 `f` z))))
.左折叠在某种意义上与右折叠是双重的。特别是,我们希望左折叠的相应图表的形状是左折叠的镜像,如下所示:
f
/ \
f 4
/ \
f 3
/ \
f 2
/ \
z 1
((((z `f` 1) `f` 2) `f` 3) `f` 4)
f
。作为第一个参数,而列表的每个元素作为第二个参数提供,即参数提供给
f
。与右折叠相比,顺序相反。
关于scala - 为什么向左折叠期望(a -> b -> a)而不是(b -> a -> a)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12288818/
我是一名优秀的程序员,十分优秀!