我想知道爲什麼預期左邊的功能有類型簽名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