Clojure 减少换能器

Clojure reduce transducer

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

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

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

reduce函数doesn't return a transducer。 之所以这样,是因为 reduce 是一个函数,return 是一个 可能是序列 的值。其他功能,如 filtermap always returns sequences(甚至为空),允许组合这些功能。

要将某些东西与 reduce 函数结合起来,您可以使用 a reducer library 它提供了类似于你想要做的功能(如果我理解正确的话)。

###UPD 好吧,我的回答有点混乱。 首先让我们看一下 filtermap 和许多其他函数的工作原理:毫不奇怪,所有这些函数都基于 reduce,它是一个缩减函数(在这样,他们就不会创建一个比输入更大的集合)。所以,如果你以任何方式减少一些 coll - 你可以结合你的减少来从所有减少函数之间的可减少 coll 传递可减少值以获得最终值。这是提高性能的好方法,因为部分值有望以某种方式为零(作为转换的一部分),并且只有一个逻辑循环(我的意思是循环,你只迭代序列一次并将每个值传递给所有转变)。 那么,为什么 reduce 函数如此不同,因为一切都建立在它之上?

所有换能器都基于一个简单有效的想法,在我看来,它看起来像筛子。但是减少可能只针对最后一步,因为结果只有一个值。因此,您可以在此处使用 reduce 的唯一方法是提供 coll 和缩减形式。 Reduce in sieve 类比就像筛子下的漏斗: 您获取您的集合,将其丢给 map 和 filter 之类的函数并获取 - 如您所见,作为转换结果的新集合的大小永远不会大于输入集合。所以最后一步可能是 reduce,它采用筛选集合并根据所做的一切取一个值。

还有一个不同的函数,它允许您组合转换器和减速器 - transducer,但它也需要一个函数,因为它就像一个入口点和我们筛子的最后一步。

reducers 库类似于 transducer,也允许 reduce 作为最后一步。这只是另一种与换能器相同的方法。

要实现您想做的事情,您可以改用 partial 函数。应该是这样的:

(def sum
  (partial reduce +'))

(sum [1 2 3])

将 return 6

的明显答案