Api 为什么在Scala中fold具有以下类型?

Api 为什么在Scala中fold具有以下类型?,api,scala,fold,higher-order-functions,Api,Scala,Fold,Higher Order Functions,我正在研究为immutable定义折叠的方式。设置: def fold [A1 >: A] (z: A1)(op: (A1, A1) ⇒ A1): A1 然而,foldLeft的定义是: def foldLeft [B] (z: B)(op: (B, A) ⇒ B): B 至少乍一看,这对我来说很奇怪,因为我希望fold能够像foldLeft一样更改它返回的集合的类型 我想这是因为foldLeft和foldRight保证了元素折叠的顺序。fold提供的保证是什么?FoldLeft似

我正在研究为immutable定义折叠的方式。设置:

def fold [A1 >: A] (z: A1)(op: (A1, A1) ⇒ A1): A1 
然而,foldLeft的定义是:

def foldLeft [B] (z: B)(op: (B, A) ⇒ B): B 
至少乍一看,这对我来说很奇怪,因为我希望fold能够像foldLeft一样更改它返回的集合的类型


我想这是因为foldLeft和foldRight保证了元素折叠的顺序。fold提供的保证是什么?

FoldLeft似乎必须返回B。该方法采用B arg-这是一个累加器。A的值用于向A B“添加更多”。返回最终累积值。我认为FoldLeft和FoldRight在这方面是相同的。

当您应用
FoldLeft
时,您的起始值与第一个列表元素相结合。结果与第二个列表元素合并。这个结果与第三个结果一致,以此类推。最终,列表已折叠为一个与起始值类型相同的元素。因此,您只需要一些可以由函数与列表元素组合的类型。
对于
foldRight
同样适用,但顺序相反

折叠
不能保证按顺序完成组合。它也不能保证它只从一个位置开始。褶皱可能平行发生。因为您可以具有并行性,所以要求任意两个列表元素或返回值可以组合在一起,这会为类型添加一个约束

关于您的评论,您必须查看大小写顺序有一个效果:假设您使用折叠来连接字符列表,并且希望得到一个文本作为结果。如果您的输入是
A、B、C
,您可能希望保留接收
ABC
的顺序,而不是
ACB
(例如)。

另一方面,如果你只是把数字相加,顺序并不重要。求和
1,2,3
得到的
6
与加法的顺序无关。在这种情况下,使用
fold
而不是
foldLeft
foldRight
可以加快执行速度。

Jean-Philippe的回答对您有帮助吗?我想,在某种程度上看。我还没有看到fold在集合API中返回与foldLeft不同的结果的情况,但我猜可能存在一些实现,需要进行这种区分。谢谢你的链接,谢谢。我认为顺序很重要,但我从未考虑过并行性。