重访折叠和减少之间的区别

Difference between fold and reduce revisted

我一直在阅读 nice answer to Difference between reduce and foldLeft/fold in functional programming (particularly Scala and Scala APIs)? provided by samthebest 但我不确定我是否了解所有细节:

如评论中所述,术语 reduce 在 MapReduce 上下文中使用时和在函数式编程上下文中使用时含义不同。

  • 在 MapReduce 中,系统按给定键对 map 函数的结果进行分组,然后调用 reduce 操作来聚合每个组的值(因此 reduce 每组调用一次)。您可以将其视为一个函数 (K, [V]) -> R 将组键 K 与属于组 [V] 的所有值一起并产生一些结果。

  • 在函数式编程中,reduce是一个函数,当你给它一个可以组合两个元素的操作时,它会聚集一些集合的元素。换句话说,您定义了一个函数 (V, V) -> Vreduce 函数使用它来将集合 [V] 聚合为单个值 V.

当您想使用 + 作为函数添加数字 [1,2,3,4] 时,reduce 函数可以通过多种方式实现:

  1. 可以运行从头计算((1+2)+3)+4)
  2. 也可以并行计算a = 1+2b = 3+4然后加上a+b!

根据定义,foldLeft 操作总是从左边开始,因此它总是使用 (1) 的评估策略。事实上,它也有一个初始值,所以它的计算结果更像是 (((0+1)+2)+3)+4)。这使得 foldLeft 对于顺序很重要的操作很有用,但这也意味着它不能用于无序集合(因为你不知道 "left" 是什么)。