Clojure还原传感器

Clojure还原传感器,clojure,reduce,transducer,Clojure,Reduce,Transducer,我正在寻找一个简单的例子,传感器与减少功能。 我希望下面的代码能够返回一个转换函数,因为(filter-odd?就是这样工作的: (def sum (reduce +)) clojure.lang.ArityException: Wrong number of args (1) passed to: core$reduce 我目前对传感器的理解是,通过省略collection参数,我们可以得到一个可以与其他转换函数组合的转换函数。为什么过滤器和减少不同?减少功能。 这是因为reduce是一个函

我正在寻找一个简单的例子,传感器与减少功能。 我希望下面的代码能够返回一个转换函数,因为
(filter-odd?
就是这样工作的:

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

我目前对传感器的理解是,通过省略collection参数,我们可以得到一个可以与其他转换函数组合的转换函数。为什么
过滤器
减少
不同?

减少功能。 这是因为
reduce
是一个函数,它返回一个可能是sequence的值。其他函数,如
过滤器
映射
总是返回序列(甚至为空),允许组合此函数

要将某物与reduce函数组合,可以使用 这提供了一个类似于您想要做的功能(如果我正确理解的话)

UPD 好的,我的答案有点混乱。 首先让我们看一下<代码>过滤器,<代码> MAP>代码>,还有许多其他功能:这并不奇怪,所有的函数都是基于<代码> Reals,它是一个还原函数(这样,它们就不会创建一个更大的集合,输入一个大的集合)。所以,如果你以任何方式减少一些coll,你可以结合你的减少,在所有的减少函数之间传递可减少coll的可减少值,得到最终的值。这是一个提高性能的好方法,因为部分值可能会以某种方式为零(作为转换的一部分),并且只有一个逻辑周期(我的意思是循环,您只需在序列上迭代一次,并将每个值传递给所有转换)。 那么,为什么
reduce
函数如此不同,因为一切都建立在它之上

所有的传道者都基于一个简单而有效的想法,在我看来,这个想法就像筛子。但由于结果只有一个值,因此减少可能仅限于最后一步。因此,在这里使用
reduce
的唯一方法是提供
coll
和reduce表单。 筛内还原类似于筛下漏斗: 你把你的集合,扔给一些函数,比如map,filter和take,正如你所看到的,转换后的新集合的大小永远不会比输入集合中的大。因此,最后一步可能是一个
reduce
,它接受一个经过筛选的集合,并根据所做的一切获取一个值

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

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

要实现您想要做的事情,您可以使用
partial
函数。它希望这样:


将返回明显的答案
6

我肯定还遗漏了什么。(clojure.core.reducers/fold+)抛出一个异常。我编辑了我的帖子以消除误解。我希望我能帮助你。
(def sum
  (partial reduce +'))

(sum [1 2 3])