Clojure:懒惰的魔法

标签 clojure lazy-evaluation lazy-sequences

几乎 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)

最佳答案

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

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

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

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

关于Clojure:懒惰的魔法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1756563/

相关文章:

clojure - 函数中的原始参数或集合参数?

Clojure - 保存记录类型的注册表

mysql - Mysql延迟加载性能

oop - 依赖属性中的 MATLAB 惰性求值

list - 关联或更新 Clojure 列表和惰性序列

clojure - 在 clojure 中延迟合并(分组)巨大序列

clojure - 如何在 clojure 中得到 "def"而不重新加载?

c++ - 具有表达式模板的多维数组模板类

functional-programming - Scheme中流的空间复杂度

clojure - 覆盖 Clojure 记录的 equals