gpt4 book ai didi

api - 为什么 fold 在 Scala 中有以下类型?

转载 作者:行者123 更新时间:2023-12-04 14:33:43 25 4
gpt4 key购买 nike

我正在查看为 immutable.Set 定义 fold 的方式:

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然后您的起始值与第一个列表元素相结合。结果与第二个列表元素相结合。此结果与第三次以此类推。最终,该列表已折叠为与您的起始值相同类型的一个元素。因此,您只需要一些可以由您的函数与列表元素组合的类型。
对于 foldRight这同样适用,但顺序相反。
fold不保证组合中的顺序完成。并且它不保证它只从一个位置开始。折叠可能同时发生。因为您可以具有并行性,所以需要可以组合任何 2 个列表元素或返回值 - 这会为类型添加约束。

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

关于api - 为什么 fold 在 Scala 中有以下类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7000149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com