clojure的目的是减少功能

sha*_*aft 12 clojure

clojure reduced函数的目的是什么(在clojure 1.5中添加,https: //clojure.github.io/clojure/clojure.core-api.html#clojure.core/reduced )

我找不到任何例子.医生说:

以某种方式包装x,使得reduce将以值x终止.

还有一个reduced?熟悉它

如果x是对reduce的调用的结果,则返回true

当我尝试一下时,例如(reduce + (reduced 100)),我得到一个错误而不是100.当我事先知道结果时,为什么我会减少一些东西呢?由于它被添加可能有一个原因,但谷歌搜索clojure reduced仅包含reduce结果.

Mic*_*zyk 19

reduced 允许你短路减少:

(reduce (fn [acc x]
          (if (> acc 10)
            (reduced acc)
            (+ acc x)))
        0 
        (range 100))
;= 15
Run Code Online (Sandbox Code Playgroud)

(注意:(reduced 0)作为初始值传入的边缘情况在Clojure 1.6中不起作用.)

这是有用的,因为reduce基于循环的循环既非常优雅非常高效(以至于reduce基于loop/ 的"自然"替换基于循环并不常见recur,所以最好使这种模式适用于广泛适用于可能.短路的能力reduce大大增加了可能的应用范围.

至于reduced?,我发现它主要reduce用于实现新数据结构的逻辑; 在常规代码中,我让它在适当的时候reduce执行自己的reduced?检查.