Clojure 减少换能器
Clojure reduce transducer
我正在寻找具有还原功能的传感器的简单示例。
我希望以下内容 return 是一个转换函数,因为 (filter odd?)
就是这样工作的:
(def sum (reduce +))
clojure.lang.ArityException: Wrong number of args (1) passed to: core$reduce
我目前对转换器的理解是,通过省略集合参数,我们得到了一个可以与其他转换函数组合的转换函数。为什么 filter
和 reduce
不同?
reduce
函数doesn't return a transducer。
之所以这样,是因为 reduce
是一个函数,return 是一个 可能是序列 的值。其他功能,如 filter
或 map
always returns sequences(甚至为空),允许组合这些功能。
要将某些东西与 reduce 函数结合起来,您可以使用 a reducer library
它提供了类似于你想要做的功能(如果我理解正确的话)。
###UPD
好吧,我的回答有点混乱。
首先让我们看一下 filter
、map
和许多其他函数的工作原理:毫不奇怪,所有这些函数都基于 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
的明显答案
我正在寻找具有还原功能的传感器的简单示例。
我希望以下内容 return 是一个转换函数,因为 (filter odd?)
就是这样工作的:
(def sum (reduce +))
clojure.lang.ArityException: Wrong number of args (1) passed to: core$reduce
我目前对转换器的理解是,通过省略集合参数,我们得到了一个可以与其他转换函数组合的转换函数。为什么 filter
和 reduce
不同?
reduce
函数doesn't return a transducer。
之所以这样,是因为 reduce
是一个函数,return 是一个 可能是序列 的值。其他功能,如 filter
或 map
always returns sequences(甚至为空),允许组合这些功能。
要将某些东西与 reduce 函数结合起来,您可以使用 a reducer library 它提供了类似于你想要做的功能(如果我理解正确的话)。
###UPD
好吧,我的回答有点混乱。
首先让我们看一下 filter
、map
和许多其他函数的工作原理:毫不奇怪,所有这些函数都基于 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