Когда вам нужно выйти из расчета рано, вам нужен способ сделать это, а не аргумент от пуристов.Обычно это нужно, когда вы уменьшаете большую коллекцию, и определенное значение указывает на то, что нет смысла в дальнейшей обработке коллекции.Для этого всегда практичный Clojure предоставляет функцию reduced
.
Простой пример, который можно проиллюстрировать, заключается в том, что при умножении последовательности чисел, если вы встретите ноль, вы ужеЗнайте, что конечный результат будет нулевым, поэтому вам не нужно смотреть на остальную часть последовательности.Вот как вы кодируете это с помощью reduced
:
(defn product [nums]
(reduce #(if (zero? %2)
(reduced 0.0)
(* %1 %2))
1.0
nums))
reduced
оборачивает указанное вами значение в структуру данных стража, так что reduce
знает, что остановить чтение из коллекции и просто вернуть *Значение 1012 * прямо сейчас.Эй, это чисто функционально, даже!
Вы можете увидеть, что происходит, если обернуть выше if
в do
с (println %1 %2)
:
user=> (product [21.0 22.0 0.0 23.0 24.0 25.0 26.0])
1.0 21.0
21.0 22.0
462.0 0.0
0.0
user=> (product [21.0 22.0 23.0 24.0 25.0 26.0])
1.0 21.0
21.0 22.0
462.0 23.0
10626.0 24.0
255024.0 25.0
6375600.0 26.0
1.657656E8