2

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

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

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

4

1 回答 1

3

reduce函数不返回传感器。之所以这样,reduce是因为该函数返回一个可能是 sequence的值。其他函数喜欢filtermap 总是返回序列(甚至是空的),允许组合这些函数。

为了将某些东西与 reduce 函数相结合,您可以使用reducer 库 ,它提供的功能类似于您想要做的事情(如果我正确理解了这一点)。

UPD

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

所有 traducer 都基于一个简单而有效的想法,在我看来,它看起来像筛子。但是减少可能只针对最后一步,因为结果只有一个值。因此,您可以reduce在此处使用的唯一方法是提供一个coll和一个归约形式。筛子类比中的减少就像筛子下的漏斗:你拿你的集合,把它扔给一些函数,比如地图和过滤器,然后拿——你可以看到新集合的大小,因为转换的结果永远不会比作为输入集合。所以最后一步可能是reduce一个筛选集合,并根据所做的一切取一个值。

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

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

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

(def sum
  (partial reduce +'))

(sum [1 2 3])

将返回明显的答案6

于 2015-12-19T11:38:01.303 回答