(conj (drop-last "abcde") (last "abcde"))
回報(\e \a \b \c \d)
有人可以解釋「conj」的行爲嗎?
我困惑。在conj
的文檔中,我注意到
'添加'可能發生在不同'地點',具體取決於具體類型。
這是否意味着對於LazySeq
,添加新項目的地方是頭部? 如何才能得到(\a \b \c \d \e)
?
(conj (drop-last "abcde") (last "abcde"))
回報(\e \a \b \c \d)
有人可以解釋「conj」的行爲嗎?
我困惑。在conj
的文檔中,我注意到
'添加'可能發生在不同'地點',具體取決於具體類型。
這是否意味着對於LazySeq
,添加新項目的地方是頭部? 如何才能得到(\a \b \c \d \e)
?
「的‘另外的地方’可能在不同的發生‘’取決於 具體類型。」
這指的是Clojure持久集合的行爲,它將性能和底層實現方面的最有效方法相加。
矢量總是添加到集合的末尾:
user=> (conj [1 2 3] 4)
[1 2 3 4]
使用列表,連接詞使該項目在列表的前面,因爲你已經注意到:
user=> (conj '(1 2 3) 4)
(4 1 2 3)
所以,是的,LazySeq就其具體實現而言被視爲一個List。
我怎樣才能得到
(\a \b \c \d \e)
?
有多種方式,但你可以很容易地創建您的LazySeq載體:
(conj (vec (drop-last "abcde"))
(last "abcde"))
重要的是要認識到,conj
只是代表們的cons
在Clojure的在IPersistentCollection
接口的實現Java的東西。因此,根據處理的給定數據結構,它可能會有不同的表現。
conj的意圖是它總是以最有效的方式將數據添加到數據結構中。
對於列出最有效的位置是前面。對於載體來說,最有效的地方就是最終。
可能的重複:http://stackoverflow.com/questions/7437833/inconsistency-with-clojures-sequences/7438355 – Gert 2012-07-15 21:50:06