我想知道为什么 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(可能还有许多其他语言)中进行左折叠的设计?