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
?对我来说,这似乎仍然打破了抽象,在两个不同类型的有序集合中,我希望结果的顺序是一致的。分为isconj
和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
的多态性。编写回文生成器时,只需输入向量或列表,即可使用相同的函数生成回文的开头和结尾