直接应用换能器并使用 "transduce" 会产生不同的结果
Applying a transducer directly and with "transduce" yield different results
据我了解,transducer 是在 reduce
发生之前转换 reducer 函数的函数。换句话说,(transduce transducer reducer collection)
等同于 (reduce (transducer reducer) collection)
。所以这两个表达式
(reduce ((map inc) -) 0 [3 4 5])
(transduce (map inc) - 0 [3 4 5])
必须return相同的值。对吗?
错误
(reduce ((map inc) -) 0 [3 4 5]) -15
(transduce (map inc) - 0 [3 4 5]) 15
错误还是功能?我的 Clojure 版本是 1.8.0
。
原来 (transduce)
实现了一个稍微不同的算法。
(reduce)
为集合中的每个元素调用 (reducer aggregate element)
。总共 n
次调用了 n
个元素的集合。
(transduce)
为每个元素调用 (reducer aggregate element)
,然后出于某种原因再次调用 (reducer aggregate)
,进行 n+1
调用。因此,(transduce)
无法按预期使用 (-)
。
据我了解,transducer 是在 reduce
发生之前转换 reducer 函数的函数。换句话说,(transduce transducer reducer collection)
等同于 (reduce (transducer reducer) collection)
。所以这两个表达式
(reduce ((map inc) -) 0 [3 4 5])
(transduce (map inc) - 0 [3 4 5])
必须return相同的值。对吗?
错误
(reduce ((map inc) -) 0 [3 4 5]) -15
(transduce (map inc) - 0 [3 4 5]) 15
错误还是功能?我的 Clojure 版本是 1.8.0
。
原来 (transduce)
实现了一个稍微不同的算法。
(reduce)
为集合中的每个元素调用 (reducer aggregate element)
。总共 n
次调用了 n
个元素的集合。
(transduce)
为每个元素调用 (reducer aggregate element)
,然后出于某种原因再次调用 (reducer aggregate)
,进行 n+1
调用。因此,(transduce)
无法按预期使用 (-)
。