我想知道为什么预期左边的功能有类型签名a -> b -> a
而不是b -> a -> a
。这背后有设计决定吗?为什么fold会预期(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(以及可能还有很多其他语言)中?
换句话说,您必须颠倒'(:)'的参数顺序才能颠倒列表。我感觉合理。 –
请注意,'mapAccumL'和'mapAccumR'(来自'Data.List' /'Data.Traversable')具有相同的签名,尽管它们也工作在相反的方向。 – leftaroundabout