为什么我会选择不使用clojure 1.5 reducers功能?

为什么我会选择不使用clojure 1.5 reducers功能?,clojure,Clojure,我正在阅读1.5中介绍的clojure还原器,这里:。我的理解是,它们是对现有map/filter/reduce函数的性能增强。如果是这样的话,我想知道为什么它们位于一个新的名称空间中,而不是简单地替换现有的map/reduce/filter实现。换言之,为什么我永远不会选择使用新的减速器功能 编辑: 对于最初的两个答案,以下是一个澄清: 我将在这里引用发行说明: 减缩器提供了一组用于处理集合的高性能函数。实际折叠/减少算法通过减少的集合指定。这允许每个集合定义减少其内容的最有效方式 这听起来不

我正在阅读1.5中介绍的clojure还原器,这里:。我的理解是,它们是对现有map/filter/reduce函数的性能增强。如果是这样的话,我想知道为什么它们位于一个新的名称空间中,而不是简单地替换现有的map/reduce/filter实现。换言之,为什么我永远不会选择使用新的减速器功能

编辑:

对于最初的两个答案,以下是一个澄清:

我将在这里引用发行说明:

减缩器提供了一组用于处理集合的高性能函数。实际折叠/减少算法通过减少的集合指定。这允许每个集合定义减少其内容的最有效方式

这听起来不像新的map/filter/reduce函数本质上是并行的。例如,在发行说明中进一步指出:

它包含一个新功能fold,它是一个并行的reduce+联合收割机


因此,除非发行说明写得不好,否则在我看来,有一个新函数fold是并行的,其他函数是特定于集合的实现,旨在为特定集合产生尽可能高的性能。我只是误读了这里的发行说明吗?

在某些情况下,它们无法取代旧的实现。例如,如果您有无限多个序列,或者您实际上需要对集合进行顺序处理

前言:你有问题,你要使用并行,现在问题二已经出现了


从某种意义上说,它们是并行工作的替代品(与普通的顺序映射等相比)。并非所有的操作都可以并行化(在许多情况下,操作必须至少是并行的,还要考虑惰性序列和迭代器)。此外,并不是每个操作都能有效地并行化(总是有一些协调开销,有时开销大于并行化增益)。

我发现Rich Hickey的以下文章,虽然仍然有些混乱,但为我澄清了(一些)事情:

特别是总结:

通过将集合视为可还原的,而不是可排序的,我们可以得到一组互补的基本操作,这些操作在保持相同的高级函数式编程模型的同时,在并行性和惰性之间进行权衡。因为两个模型保持相同的形状,我们可以很容易地选择适合手头任务的模型


以下是您决定不使用减速器的几个好理由:

  • 您需要保持与Clojure 1.4的向后兼容性。这使得在库代码中使用减缩器变得很棘手,例如,您不知道将要使用的Clojure版本
  • 在某些情况下,有更好的选择:例如,如果您处理的是数字数组,那么您几乎肯定最好使用类似的方法

好问题,尽管“[W]hy我永远不会选择使用新的[clojure]reducers功能”是一个更好的标题。谢谢你的反馈,完成了。这可能有助于理解为什么reducers不能仅仅取代旧的实现:你可以试着看这个演讲:对,例如(以5(进入[])(r/map(部分str FOO)(反复地#(java.util.UUID.randomUUIDааааааа)永不终止。在这种情况下,你肯定想要懒惰。感谢转发。