2016-03-12 5 views
5

Слегка модифицированная версия 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 с осуждением?

+0

Кажется, что отличия, которые вы упомянули (с использованием функции уменьшения для создания значения инициализации и использования сокращения-kv для карт), являются единственными. Я думаю, мы можем предположить, что использование специализированной версии для карт позволяет избежать накладных расходов распределения, поскольку каждая запись карты не должна быть обернута в 2-элементный вектор, но вместо этого передается непосредственно в виде отдельных аргументов для уменьшения функции. –

ответ

3

Две возможные причины:

  1. Он имеет разные - лучше! - семантика, чем clojure.core/reduce в последовательном последовательном случае. Во время своей презентации в 2014 году Кондж Рич Хики спросил: «Кто знает, что такое семантика reduce, когда вы называете ее коллекцией и нет первоначального значения?» - follow this link for the exact spot in the presentation - а затем описал указанную семантику как «смешное, сложное правило» и «одну из худших вещей, которые он когда-либо копировал из Common Lisp» - ср. Common Lisp's reduce contract. Презентация была посвящена преобразователям, и в контексте замечания было обсуждение transduce, которое имеет превосходный, более простой контракт; r/reduce делает.

  2. Даже без учета выше, это своего рода приятно иметь версию reduce с контрактом очень близким к fold. Это позволяет просто «попробовать один, попробовать другой» с такими же аргументами, а также просто изменить свое мнение.

Смежные вопросы