我一直在读一nice answer到Difference between reduce and foldLeft/fold in functional programming (particularly Scala and Scala APIs)?由samthebest提供,我不知道如果我理解所有的细节:差异,减少再谈
根据答案(
reduce
VSfoldLeft
):一个很大很大的区别(...)是降低应给予可交换独异,(...)
这种区别对大数据/ MPP /分布式计算非常重要,甚至存在减少的全部原因。
和
减少被正式定义为MapReduce的范例的一部分,
我不知道这两种说法如何结合。任何人都可以对此有所了解吗?
我测试了不同的收藏,我还没有看到
reduce
和foldLeft
之间的性能差异。它看起来像ParSeq
是一个特例,是吗?我们是否真的需要订购
fold
?我们不能定义fold,因为块没有排序,fold只需要关联性而不是交换性。
为什么它不能被推广到无序集合?
有什么可以理解的?对于'foldLeft',你不能假设关联性/交换性(没有并行化的机会),对于'reduce'你可以(平行化)。不知道如何做得更清楚。这些都是通用概念,并且超出了任何特定时间点在Scala标准库中发生的任何集合的性能。 –
@JaredSmith我认为减少MapReduce与减少Spark或Scala集合的意义不同。我错了吗? – user7337271
是的,AFAIK目前唯一的区别是可以提供给'foldLeft'的种子值。但是你引用的答案的重点是*应该*是一个涉及应用于所讨论类型的二元运算符的数学性质的差异。这个问题的答案应该可以帮助你http://stackoverflow.com/questions/17408880/reduce-fold-or-scan-left-right –