【问题标题】:Clojure: lazy magicClojure:懒惰的魔法
【发布时间】:2010-12-17 21:54:39
【问题描述】:

几乎 2 个相同的程序可以生成无限的惰性随机序列。 第一个不会崩溃。出现 OutOfMemoryError 异常的第二次崩溃。为什么?

;Return infinite lazy sequence of random numbers    
(defn inf-rand[] (lazy-seq (cons (rand) (inf-rand))))    

;Never returns. Burns the CPU but won't crash and lives forever.    
(last (inf-rand))

但很快就发生了以下崩溃:

;Return infinite lazy sequence of random numbers    
(defn inf-rand[] (lazy-seq (cons (rand) (inf-rand))))    
(def r1 (inf-rand))

;Crash with "OutOfMemoryError"
 (last r1)

【问题讨论】:

    标签: clojure lazy-evaluation lazy-sequences


    【解决方案1】:

    我相信这是一个“抱头”的例子。

    通过在第二个示例中引用 r1,您打开了稍后说出类似 (first r1) 之类的内容的可能性,因此您最终将存储您的惰性序列的成员,因为它们被具体化了。

    在第一种情况下,Clojure 可以确定永远不会对无限序列的早期成员执行任何操作,因此可以处理它们而不消耗内存。

    我自己还是一个 Clojure 初学者,非常感谢任何对我的理解或术语的 cmet 或更正。

    【讨论】:

    • 我也是初学者,但你的解释看起来很正确。如果你没有打败我,我会回答同样的事情! 6 位支持者似乎同意你的观点。
    • 不久前,当我开始在 Clojure 中处理 Project Euler 问题时,我在无限惰性序列上的调试打印会减慢我的程序速度……无限地。无限惰性序列是一个重要的 Clojure 概念。
    • 顺便说一句,怎么没有 StackOverflow。 inf-rand中存在无限递归
    • 没有堆栈溢出,因为惰性求值不会递归堆栈。每个元素都被评估并返回。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多