gpt4 book ai didi

clojure - 如何创建惰性序列向量

转载 作者:行者123 更新时间:2023-12-04 06:33:10 25 4
gpt4 key购买 nike

运行它按预期工作:

(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 call 贪婪地消耗 long-seq-vec 产生的递归序列并导致堆栈溢出。因此,不可能创建无限向量(通常,如果它是惰性或循环的,则只能创建无限数据结构)。

它适用于第一个示例,因为 cons当 consing 到一个惰性序列的前面时,很高兴表现得惰性,所以序列可以是无限的。

假设你真的想要一个无限的向量序列,我建议如下:

(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以类似的方式。

关于clojure - 如何创建惰性序列向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12206806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com