【问题标题】:purpose of clojure reduced functionClojure减少功能的目的
【发布时间】:2014-09-26 05:40:47
【问题描述】:

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 结果。

【问题讨论】:

    标签: clojure


    【解决方案1】:

    reduced 允许你短路一个还原:

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

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

    这很有用,因为基于reduce 的循环既非常优雅并且非常高效(以至于基于reduce 的循环并不经常比“自然”替换更高效基于loop/recur),所以最好让这个模式尽可能广泛地适用。短路reduce 的能力大大增加了可能的应用范围。

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

    【讨论】:

    • 那么,本质上它就像其他语言中的'break'语句?
    • 你能举个减少的例子吗?功能?
    • 回复:break,我想你可以这么说。至于reduced?,当然——data.avlreduce-kv 实现使用reduced?,这里是the source as of release 0.0.12
    猜你喜欢
    • 2018-10-29
    • 2020-03-25
    • 2016-03-26
    • 2020-11-01
    • 2016-05-02
    • 1970-01-01
    • 2019-11-02
    • 2014-03-08
    • 2012-03-18
    相关资源
    最近更新 更多