运行它按预期工作:
(defn long-seq [n]
(lazy-seq (cons
(list n {:somekey (* n 2)})
(long-seq (+ n 1)))))
(take 3 (long-seq 3))
; => ((3 {:somekey 6}) (4 {:somekey 8}) (5 {:somekey 10}))
不过我想用向量做同样的事情:
(defn long-seq-vec [n]
(lazy-seq (into
(vector (list n {:somekey (* n 2)}))
(long-seq-vec (+ n 1)))))
(take 3 (long-seq-vec 3))
这给了我一个堆栈溢出。为什么?
主要原因是向量并不懒惰- 所以into
贪婪地调用消耗了由以下方式产生的递归序列long-seq-vec
并导致堆栈溢出。由此推论,不可能创建无限向量(通常,只有惰性或循环的数据结构才能创建无限数据结构)。
它在第一个示例中有效,因为cons
当 cons 到一个惰性序列的前面时,它很乐意表现出惰性,因此该序列可以是无限的。
假设您实际上想要无限的向量序列,我建议如下:
(defn long-seq-vec [n]
(lazy-seq (cons
(vector n {:somekey (* n 2)})
(long-seq-vec (+ n 1)))))
(take 3 (long-seq-vec 3))
=> ([3 {:somekey 6}] [4 {:somekey 8}] [5 {:somekey 10}])
或者作为替代方案,您可以使用for
这本身就是懒惰的:
(defn long-seq-vec [n]
(for [x (iterate inc n)]
(vector x {:somekey (* x 2)})))
我更喜欢这个,因为它避免了lazy-seq
/cons
样板文件,避免递归,并且在表达你的函数的作用方面更加清晰......如果你愿意的话,它更加“声明性”。你也可以使用map
以类似的方式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)