Clojure-为什么into在列表中的行为与向量不同?

Clojure-为什么into在列表中的行为与向量不同?,clojure,Clojure,当插入的集合不同时,into的行为为何会不同?例如: user=> (into [] [1 2 3]) [1 2 3] 到目前为止,一切顺利。正如我所料。然而: user=> (into () [1 2 3]) (3 2 1) 为什么这会推翻这些论点?我假设这是为了性能,项目是按顺序插入的,带有cons?对我来说,这似乎仍然打破了抽象,在两个不同类型的有序集合中,我希望结果的顺序是一致的。分为isconj和seq conj在开始时添加到列表中,在结束时添加向量以提高效率,这样就不

当插入的集合不同时,
into
的行为为何会不同?例如:

user=> (into [] [1 2 3])
[1 2 3]
到目前为止,一切顺利。正如我所料。然而:

user=> (into () [1 2 3])
(3 2 1)

为什么这会推翻这些论点?我假设这是为了性能,项目是按顺序插入的,带有
cons
?对我来说,这似乎仍然打破了抽象,在两个不同类型的有序集合中,我希望结果的顺序是一致的。

分为
is
conj
seq

conj在开始时添加到列表中,在结束时添加向量以提高效率,这样就不需要遍历任何一种类型来添加到列表中

在Clojure中讨论集合抽象时,这一点在中得到了很好的解释:

这些函数(conj/seq/count/empty/=)都具有多态性 关于正在操作的收集的具体类型。说 另一种方式是,每个操作都提供与 每个数据结构实现的约束


作为@MarkFisher's的附录:
into
类似于
reduce conj
的行为差异源于
conj的行为差异:

(conj '(:b :c) :a)             ;; '(:a :b :c)      ;; prepend to lists
(conj  [:a :b] :c)             ;; [:a :b :c]       ;; append to vectors

(conj #{:a :b}    :c)          ;; #{:a :b :c}      ;; add to sets
(conj #{:a :b :c} :c)          ;; #{:a :b :c}      ;; nothing if already there

(conj {:a 1 :b 2}      [:c 3]) ;; {:a 1 :b 2 :c 3} ;; add key-value
(conj {:a 1 :b 2 :c 3} [:c 4]) ;; {:a 1 :b 2 :c 4} ;; replace value if present
EDIT:我最近利用了
conj
的多态性。编写回文生成器时,只需输入向量或列表,即可使用相同的函数生成回文的开头和结尾