我正在寻找一个具有缩减功能的传感器的简单示例。我希望以下内容会返回一个转换函数,因为(filter odd?)
这样工作:
(def sum (reduce +))
clojure.lang.ArityException: Wrong number of args (1) passed to: core$reduce
我目前对换能器的理解是,通过省略集合参数,我们得到一个可以与其他换能函数组合的换能函数。为什么filter
和不同reduce
?
我正在寻找一个具有缩减功能的传感器的简单示例。我希望以下内容会返回一个转换函数,因为(filter odd?)
这样工作:
(def sum (reduce +))
clojure.lang.ArityException: Wrong number of args (1) passed to: core$reduce
我目前对换能器的理解是,通过省略集合参数,我们得到一个可以与其他换能函数组合的换能函数。为什么filter
和不同reduce
?
该reduce
函数不返回传感器。之所以这样,reduce
是因为该函数返回一个可能是 sequence的值。其他函数喜欢filter
或map
总是返回序列(甚至是空的),允许组合这些函数。
为了将某些东西与 reduce 函数相结合,您可以使用reducer 库 ,它提供的功能类似于您想要做的事情(如果我正确理解了这一点)。
好吧,我的回答有点混乱。首先让我们看一下如何filter
,map
以及许多其他函数的工作原理:这并不奇怪,所有这些函数都是基于的reduce
,它是一个归约函数(这样,他们不会创建一个更大尺寸的集合输入一)。因此,如果您以任何方式减少一些 coll - 您可以组合您的减少以在所有减少函数之间从可减少的 coll 传递可减少的值以获得最终值。这是提高性能的好方法,因为部分值有望以某种方式为零(作为转换的一部分),并且只有一个逻辑循环(我的意思是循环,您只迭代序列一次并将每个值传递给所有转变)。那么,为什么reduce
功能如此不同,因为一切都建立在它之上?
所有 traducer 都基于一个简单而有效的想法,在我看来,它看起来像筛子。但是减少可能只针对最后一步,因为结果只有一个值。因此,您可以reduce
在此处使用的唯一方法是提供一个coll
和一个归约形式。筛子类比中的减少就像筛子下的漏斗:你拿你的集合,把它扔给一些函数,比如地图和过滤器,然后拿——你可以看到新集合的大小,因为转换的结果永远不会比作为输入集合。所以最后一步可能是reduce
一个筛选集合,并根据所做的一切取一个值。
还有一个不同的函数,它允许您组合传感器和减速器 - transducer
,但它也需要一个函数,因为它就像一个入口点,也是我们筛子的最后一步。
reducers 库类似于传感器,也允许reduce
作为最后一步。这只是制作与换能器相同的另一种方法。
要实现您想要做的事情,您可以改用partial
函数。它会是这样的:
(def sum
(partial reduce +'))
(sum [1 2 3])
将返回明显的答案6