折叠和减少之间的差异重新审视

use*_*271 2 reduce functional-programming mapreduce fold

我一直在读一个很好的答案,以减少和foldLeft /折叠功能编程(尤其是Scala和斯卡拉API)的区别?samthebest提供,我不确定我是否理解所有细节:

  • 根据答案(reducevs foldLeft):

    一个很大的区别(...)是减少应该给予一个可交换的幺半群,(...)

    这种区别对于大数据/ MPP /分布式计算非常重要,并且存在减少甚至存在的全部原因.

    Reduce正式定义为MapReduce范例的一部分,

    我不确定这两个陈述是如何结合的.任何人都可以对此有所了解吗?

  • 我测试了不同的系列,我没有看到reduce和之间的性能差异foldLeft.它看起来像是ParSeq一个特例,是吗?

  • 我们真的需要订单来定义fold吗?

    我们无法定义折叠,因为块没有排序,折叠只需要关联性,而不是交换性.

    为什么它不能被推广到无序集合?

Tom*_*cek 7

正如评论中所提到的,当在MapReduce的上下文中使用时以及在函数式编程的上下文中使用时,术语reduce意味着不同的东西.

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

  • 在函数式编程中,reduce当您为其提供可以组合两个元素的操作时,它是一个聚合某些集合的元素的函数.换句话说,您定义一个函数(V, V) -> V,reduce函数使用它将集合聚合[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对于顺序很重要的操作很有用,但它也意味着它无法实现无序集合(因为你不知道"左"是什么).