Назначение clojure уменьшенной функции

Какова цель функции clojure reduced (добавлена ​​в clojure 1.5, https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/reduced)

Я не могу найти для него никаких примеров. Док говорит:

Обертывает x таким образом, что сокращение будет заканчиваться со значением x.

Существует также reduced?, который ему знаком

Возвращает true, если x является результатом вызова сокращенного

Когда я попробую, например, с (reduce + (reduced 100)), я получаю сообщение об ошибке вместо 100. Также зачем мне что-то уменьшать, когда я знаю результат заранее? Поскольку он был добавлен, вероятно, есть причина, но поиск в googling для clojure reduced содержит только результаты reduce.

Ответ 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? проверки там, где это необходимо.