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

标签 api scala fold higher-order-functions

我正在查看为 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/

相关文章:

C++ 字典 API

scala - Akka Stream + Akka Http - 获取错误请求

scala - Scala 中这个表达式中 '_.nextInt' 的值是多少

string - 高阶函数haskell

api - Symfony 4 内部服务器错误 : Context visitingStack not working well

python - 传入 Flask 的可能路径列表?

javascript - 在 Angular 6 中显示来自 api 的数据时出现问题

scala - scala 中的 "dangling"本地 block

f# - 在 F# 中使用 Seq.fold 的更好方法

sml Foldl 解释/跟踪