2016-08-06 2 views
0

Насколько я понимаю, преобразователь является функцией, которая преобразует функцию редуктора до reduce. Другими словами, (transduce transducer reducer collection) эквивалентен (reduce (transducer reducer) collection). Поэтому эти два выраженияПрименение преобразователя напрямую и с «трансдукцией» дает разные результаты

(reduce ((map inc) -) 0 [3 4 5]) 
(transduce (map inc) - 0 [3 4 5]) 

должно возвращать то же значение. Правильно?

Неправильный

(reduce ((map inc) -) 0 [3 4 5]) -15 
(transduce (map inc) - 0 [3 4 5]) 15 

ошибка или особенность? Моя версия Clojure - 1.8.0.

ответ

2

Оказывается, что (transduce) реализует несколько иной алгоритм.

(reduce) звонки (reducer aggregate element) для каждого элемента в коллекции. В общей сложности n призывает коллекцию n элементов.

(transduce) вызывает (reducer aggregate element) для каждого элемента, а затем по какой-либо причине вызывает (reducer aggregate), совершив n+1 звонки. В результате (transduce) не работает должным образом с (-).

+7

, кстати, это то, что «завершение» для - если вы используете 'transduce' с' (completeting -) 'вместо' -', вы получите ожидаемый результат – noisesmith