为什么在Scala中折叠具有以下类型?

Hen*_*son 6 api scala fold higher-order-functions

我正在研究为immutable定义fold的方式.设置:

def fold [A1 >: A] (z: A1)(op: (A1, A1) ? A1): A1 
Run Code Online (Sandbox Code Playgroud)

但foldLeft定义为:

def foldLeft [B] (z: B)(op: (B, A) ? B): B 
Run Code Online (Sandbox Code Playgroud)

对我来说这看起来很奇怪,至少乍一看,因为我期望折叠能够改变它返回的集合的类型,就像foldLeft那样.

我想这是因为foldLeft和foldRight保证了元素折叠的顺序.折叠给出的保证是什么?

Aug*_*ing 7

当您申请时,foldLeft您的起始值将与第一个列表元素相结合.结果与第二个列表元素组合在一起.这个结果与第三个等等有关.最终,列表已折叠为与起始值相同类型的一个元素.因此,您只需要一些可以通过函数与list元素组合的类型.
对于foldRight同样适用,但以相反的顺序.

fold不保证组合完成后的订单.并不保证它只在一个位置开始.折叠可能并行发生.因为您可以具有并行性,所以可以组合任何2个列表元素或返回值 - 这会为类型添加约束.

关于你的评论,你必须看到一个案例,订单有效:假设你使用折叠来连接一个字符列表,你想要一个文本作为结果.如果您的输入是A, B, C,您可能希望保留接收的订单ABC而不是ACB(例如).
另一方面,如果您只是添加数字,则顺序无关紧要.总结1, 2, 3给出了6独立的加法秩序.在这种情况下使用fold而不是foldLeftfoldRight可能导致更快的执行.