在调用转换时,集合值会传递多少个缩减函数?

时间:2016-02-23 00:15:47

标签: clojure

考虑

(transduce (comp (filter even?) (map inc)) conj [1 2 3]) ; => [3]

如果我们让(filter even?)返回的传感器的返回值为F,并且(map inc)返回的传感器的返回值为M,那么{ {1}}和F正在减少功能。此外,M是一种减少功能。

问题:拨打conj时,来自{{1}的transduce12均为3通过每个还原函数[1 2 3]FM传递,或者是单个还原函数{ {1}}(这是某种方式conjRF的组合)这些元素通过了吗?

(旁白:如果是前一种情况,那么必须在幕后进行中间收集。因为我知道换能器的目的是避免创建中间收集,我假设它必须是后者。只是试图澄清我的理解:)

2 个答案:

答案 0 :(得分:2)

请注意,(comp (filter even?) (map inc))将生成一个函数,该函数将由两个函数(filtermap组成),因此每个值都将传递给此单个组合函数。 filtermap次调用之间不会有中间集合。

答案 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一样使用它。集合的每个元素依次传递给该归约函数。因此,只需要对集合执行一次遍历即可完成约简操作。