Слегка модифицированная версия reduce
была введена с reducers, clojure.core.reducers/reduce
(короткий r/reduce
):Какова цель clojure.core.reducers/уменьшить?
(defn reduce
([f coll]
(reduce f (f) coll))
([f init coll]
(if (instance? java.util.Map coll)
(clojure.core.protocols/kv-reduce coll f init)
(clojure.core.protocols/coll-reduce coll f init))))
r/reduce
отличается от своего основного брата только в том, что он использует (f)
в качестве начального значения, когда не предусмотрено ни, и делегатов к ядру reduce-kv
для карт.
Я не понимаю, какой может быть использование такого нечетного специального назначения reduce
и почему его стоит включить в библиотеку редукторов.
Любопытно, что r/reduce
не упоминается в двух вводных сообщениях в блоге, насколько я могу судить (first, second). Официальная документация
В целом, большинство пользователей не обращаются к r/reduce напрямую и вместо этого предпочитают r/fold (...) Однако может быть полезно выполнить ускоренное сокращение с меньшим количеством промежуточных результатов.
Я не уверен, что намекает это последнее предложение.
В каких ситуациях может возникнуть проблема с сокращением сердечника? Когда я получу за r/reduce
с осуждением?
Кажется, что отличия, которые вы упомянули (с использованием функции уменьшения для создания значения инициализации и использования сокращения-kv для карт), являются единственными. Я думаю, мы можем предположить, что использование специализированной версии для карт позволяет избежать накладных расходов распределения, поскольку каждая запись карты не должна быть обернута в 2-элементный вектор, но вместо этого передается непосредственно в виде отдельных аргументов для уменьшения функции. –