不确定在构建惰性序列时使用 flatten 时观察到的行为是什么。
查看 clojure.core 中的源代码,我可以看到 flatten 函数调用了过滤器,因此应该返回一个惰性序列 - 我认为。然而下面的代码片段给了我一个 stackoverflow 错误。在对 flatten 的调用替换为对 concat 的调用的代码段中,它工作得很好
(defn l-f [c]
(if (nil? c) []
(lazy-seq (flatten (cons [[ :h :j] :a :B] (l-f (rest c)))))))
(take 10 (l-f (repeat 2))) is how I invoke it.
这是一个相当人为的例子。我也知道 flatten 和 concat 会给我嵌套级别不同的序列。
我试图弄清楚为什么 flatten 似乎打破了懒惰,尽管我对 clojure.core 中代码的(有限)理解表明并非如此。