Clojure 为什么向量上的concat计算为列表?
对向量调用concat将返回一个列表。作为一个完全的noob,我希望结果也是一个向量。为什么要转换为列表 例如:Clojure 为什么向量上的concat计算为列表?,clojure,Clojure,对向量调用concat将返回一个列表。作为一个完全的noob,我希望结果也是一个向量。为什么要转换为列表 例如: user=> (concat [1 2] [3 4] [5 6]) (1 2 3 4 5 6) ; Why not: [1 2 3 4 5 6] ? concat返回一个惰性序列 user=> (doc concat) ------------------------- clojure.core/concat ([] [x] [x y] [x y & zs])
user=> (concat [1 2] [3 4] [5 6])
(1 2 3 4 5 6)
; Why not: [1 2 3 4 5 6] ?
concat返回一个惰性序列
user=> (doc concat)
-------------------------
clojure.core/concat
([] [x] [x y] [x y & zs])
Returns a lazy seq representing the concatenation of the elements in the supplied colls.
您可以将其转换回向量,转换为:
user=> (into [] (concat [1 2] [3 4] [5 6]))
[1 2 3 4 5 6]
into使用瞬变,因此速度非常快。还有
vec
用于性能非常相似的稍短代码。我相信“为什么”是因为它返回一个LazySeq,而不是真正的列表。此外,Clojure向量并不懒惰。请参阅。concat
仅返回其doc
中提到的序列。正如Michal已经提到的,您可以将concat
的结果发送到vec
函数,返回向量:(vec(concat[1 2][3 4][5 6])
(感谢您@Mars的建议)