【问题标题】:Why isn't a Clojure function that consists solely of lazy function calls lazy as well?为什么仅由惰性函数调用组成的 Clojure 函数也不是惰性的?
【发布时间】:2012-07-08 20:23:08
【问题描述】:

Clojure 函数

(reductions + 0 (cycle [1 1 -1]))

产生一个序列 [0 1 2 1 2 3 2 3 4 3 4 5 ...]。不幸的是,这个序列并不懒惰。

由于cyclereductions 都被记录为返回惰性序列,我希望这些函数的这种组合也能返回一个惰性序列。为什么不,我该如何修复它以延迟返回序列?

显示相同问题的更复杂示例:

(reductions (fn [x f] (f x)) 0 (cycle [inc inc dec]))

(我展示这个,因为这是我希望最终使用的那种版本,以防万一有什么不同)

【问题讨论】:

    标签: clojure functional-programming lazy-evaluation


    【解决方案1】:

    不幸的是,这个序列并不懒惰。

    哦,是的,是的。我们可以通过获取它的前 10 个元素来快速检查它是否是惰性的:

    (take 10 (reductions + 0 (cycle [1 1 -1])))
    

    这很快就会返回一个答案,这证明了这个序列是惰性的。如果函数不是惰性的,它会尝试实现无限序列中的所有元素,并且会破坏内存,或者陷入无限循环。

    发生的情况是您在 REPL 中键入此 func,它会在显示给您之前尝试实现该序列。

    编辑:如果您发现自己触发了一个或不小心尝试实现无限序列,请使用此提示stop infinite loops

    【讨论】:

    • 谢谢:)。我尝试通过 (def ...) 声明对序列进行别名以防止这种情况发生,但当然(我现在意识到)这不起作用。用 (defn ...) 命名它就可以了。
    • 检查函数是否惰性的更准确方法是将其包装在已实现? .如果返回 false,则该函数是惰性的。 =>(实现?(减少+0(循环[1 1 -1])))假
    • realized? 在这个目的上工作得非常糟糕(事实上,对于大多数目的来说;希望它很快得到改进)。在所有这些值上尝试realized?[]nil'(a b c)(iterate inc 0),你就会明白我的意思了。
    猜你喜欢
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多