我不明白为什么这个lazy-seq会导致stackoverflow,当你将序列传递给dorun时为什么不会:
(defn very-lazy [s]
(lazy-seq
(if (seq s)
[(first s) (very-lazy (rest s))]
[])))
(dorun (very-lazy (range 200000000)))
>nil
(take 2 (very-lazy (range 20000000))
>...(1577 (java.lang.StackOverflowError
如果它很懒,那么
take 2
应该导致惰性 seq 只迭代两次,为什么没有发生,为什么 dorun 有效?
最佳答案
在您的示例函数中返回 lazyseq (0 (1 (2 (3 (...)))))
.这就是为什么dorun
在没有计算器溢出的情况下运行(有两个元素的序列 0
和 (1 (2 (...)))
,dorun
不计算)和 second
失败(它返回无限嵌套序列,repl 尝试评估以打印输出)。
我猜你正在寻找这个解决方案
(defn very-lazy [s]
(lazy-seq
(if (seq s)
(cons (first s) (very-lazy (rest s)))
[])))
(take 10 (very-lazy (range 200000000)))
-> (0 1 2 3 4 5 6 7 8 9)
关于recursion - Clojure 中的递归惰性序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14002358/