purpose of clojure reduced function

孤人 提交于 2020-01-22 17:36:58

问题


What is the purpose of the clojure reduced function (added in clojure 1.5, https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/reduced)

I can't find any examples for it. The doc says:

Wraps x in a way such that a reduce will terminate with the value x.

There is also a reduced? which is acquainted to it

Returns true if x is the result of a call to reduced

When I try it out, e.g with (reduce + (reduced 100)), I get an error instead of 100. Also why would I reduce something when I know the result in advance? Since it was added there is likely a reason, but googling for clojure reduced only contains reduce results.


回答1:


reduced allows you to short circuit a reduction:

(reduce (fn [acc x]
          (if (> acc 10)
            (reduced acc)
            (+ acc x)))
        0 
        (range 100))
;= 15

(NB. the edge case with (reduced 0) passed in as the initial value doesn't work as of Clojure 1.6.)

This is useful, because reduce-based looping is both very elegant and very performant (so much so that reduce-based loops are not infrequently more performant than the "natural" replacements based on loop/recur), so it's good to make this pattern as broadly applicable as possible. The ability to short circuit reduce vastly increases the range of possible applications.

As for reduced?, I find it useful primarily when implementing reduce logic for new data structures; in regular code, I let reduce perform its own reduced? checks where appropriate.



来源:https://stackoverflow.com/questions/25106988/purpose-of-clojure-reduced-function

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!