Ответ 1
reduced
позволяет сократить короткое замыкание:
(reduce (fn [acc x]
(if (> acc 10)
(reduced acc)
(+ acc x)))
0
(range 100))
;= 15
(NB, краевой регистр с (reduced 0)
передан, поскольку начальное значение не работает с Clojure 1.6.)
Это полезно, потому что цикл на основе reduce
очень элегантен и очень эффективен (настолько, что петли на основе reduce
нередко более эффективны, чем "естественные" замены на основе loop
/recur
), поэтому хорошо сделать этот шаблон максимально применимым. Возможность короткого замыкания reduce
значительно увеличивает диапазон возможных применений.
Что касается reduced?
, я считаю это полезным, прежде всего, при реализации логики reduce
для новых структур данных; в регулярном коде я позволяю reduce
выполнять собственные reduced?
проверки там, где это необходимо.