考虑
(transduce (comp (filter even?) (map inc)) conj [1 2 3]) ; => [3]
如果我们让(filter even?)
返回的传感器的返回值为F
,并且(map inc)
返回的传感器的返回值为M
,那么{ {1}}和F
正在减少功能。此外,M
是一种减少功能。
问题:拨打conj
时,来自{{1}的transduce
,1
和2
均为3
通过每个还原函数[1 2 3]
,F
和M
传递,或者是单个还原函数{ {1}}(这是某种方式conj
,R
和F
的组合)这些元素通过了吗?
(旁白:如果是前一种情况,那么必须在幕后进行中间收集。因为我知道换能器的目的是避免创建中间收集,我假设它必须是后者。只是试图澄清我的理解:)
答案 0 :(得分:2)
请注意,(comp (filter even?) (map inc))
将生成一个函数,该函数将由两个函数(filter
和map
组成),因此每个值都将传递给此单个组合函数。 filter
和map
次调用之间不会有中间集合。
答案 1 :(得分:0)
确实没有创建任何中间集合是正确的。但是,有一些错误值得澄清。
如果让(过滤器> even?)返回的换能器的返回值为F,>(map inc)返回的换能器的返回值为M,则F和M均为归约函数。在>加法中,conj是归约函数。
准确地说,(filter even?)
和(map inc)
是换能器或 xforms -这是“ transducer
概念的产生。 换能器是一种函数,它接受作为归约函数的参数(例如,conj
或+
),并产生新的归约功能。 transduce
函数将transducer
作为其第一个参数,并将reducing function
作为其第二个参数。然后将换能器应用于归约函数,以获得新的归约函数。就像旧的reduce
函数一样,此新的归约函数也将完全应用于集合的元素。
例如,这意味着所有要遵循的都是reducing functions
:
conj
((map inc) conj)
((filter even?) conj)
((compose (map inc) (filter even?)) conj)
在上面的后面的示例中,compose
将其参数在链中应用到conj
-因此将(map inc)
应用于conj
并产生归约函数,该归约函数然后将其馈送到(filter even?)
以创建最终的归约函数。
因此,总而言之,transduce
函数首先使用其第一个和第二个参数创建一个“ new”归约函数。然后,它像reduce
一样使用它。集合的每个元素依次传递给该归约函数。因此,只需要对集合执行一次遍历即可完成约简操作。