Clojure减少传感器

时间:2015-12-19 11:00:51

标签: clojure reduce transducer

我正在寻找具有还原功能的传感器的简单示例。 我希望以下内容会返回一个转换函数,因为(filter odd?)的工作方式是这样的:

(def sum (reduce +))
clojure.lang.ArityException: Wrong number of args (1) passed to: core$reduce

我目前对换能器的理解是,通过省略收集论证,我们得到了一个我们可以与其他换能函数组合的换能函数。为什么filterreduce会有所不同?

1 个答案:

答案 0 :(得分:3)

reduce函数doesn't return a transducer。 就是这样,因为reduce是一个返回可能是序列的值的函数。其他功能如filtermap 始终返回序列(甚至为空),允许组合此功能。

要将某些内容与reduce功能组合在一起,您可以使用a reducer library 它提供了类似于你想要做的功能(如果我正确地理解了这一点)。

UPD

好的,我的回答有点令人困惑。 首先让我们来看看filtermap和许多其他函数是如何工作的:所有这些函数都基于reduce并不令人惊讶,它是一个简化函数(在这样,他们不会创建一个更大的集合来输入一个)。因此,如果您以任何方式减少某些碰撞 - 您可以将减少量与所有减少函数之间的可缩减碰撞中的可减少值相结合,以获得最终值。这是提高性能的一种很好的方法,因为部分值肯定会以某种方式为零(作为转换的一部分),并且只有一个逻辑循环(我的意思是循环,你只重复一次序列并将所有值传递给所有转型)。 那么,为什么reduce函数是如此不同,因为一切都建立在它上面?

所有传感器都基于一个简单而有效的想法,在我看来,它看起来像筛子。但减少可能只是最后一步,因为结果只有一个值。因此,您可以在此处使用reduce的唯一方法是提供coll和缩减表单。 减少筛子类比就像在筛子下漏斗: 你把你的集合,把它扔到像map和filter这样的函数中去 - 并且你可以看到,作为转换结果的新集合的大小永远不会比作为输入集合大。所以最后一步可能是一个reduce,它接受​​一个过筛的集合,并根据所做的一切取一个值。

还有一个不同的功能,它允许你组合传感器和减速器 - transducer,但它也需要一个功能,因为它就像一个入口点和筛子的最后一步。

reducer库与传感器类似,也允许reduce作为最后一步。这只是另一种与传感器相同的方法。

实现您的目标您可以使用partial功能。它想是这样的:

(def sum
  (partial reduce +'))

(sum [1 2 3])

将返回6

的明显答案