Ответы:
Еще раз, кажется, я ответил на свой вопрос, проявив нетерпение и задав его в #clojure на Freenode. На Stackoverflow.com рекомендуется отвечать на ваши вопросы: D
У меня было быстрое обсуждение с Ричем Хики, и вот суть этого.
[12:21] <Raynes> Vectors aren't seqs, right?
[12:21] <rhickey> Raynes: no, but they are sequential
[12:21] <rhickey> ,(sequential? [1 2 3])
[12:21] <clojurebot> true
[12:22] <Raynes> When would you want to use a list over a vector?
[12:22] <rhickey> when generating code, when generating back-to-front
[12:23] <rhickey> not too often in Clojure
Если вы много занимались программированием на Java и знакомы с фреймворком Java-коллекций, подумайте о списках как LinkedList
и векторах как ArrayList
. Таким образом, вы можете выбрать контейнеры таким же образом.
Для дальнейшего пояснения: если вы намерены добавлять элементы по отдельности в начало или конец последовательности, связанный список намного лучше, чем вектор, потому что элементы не нужно перетасовывать каждый раз. Однако, если вы хотите получить доступ к определенным элементам (не в начале или в конце списка) часто (например, произвольный доступ), вам нужно будет использовать вектор.
Кстати, векторы легко превращаются в последовательности.
user=> (def v (vector 1 2 3))
#'user/v
user=> v
[1 2 3]
user=> (seq v)
(1 2 3)
user=> (rseq v)
(3 2 1)
ArrayList
без эффективного переопределения ArrayDeque
себя.
Векторы имеют O (1) времен произвольного доступа, но они должны быть предварительно выделены. Списки могут быть динамически расширены, но доступ к случайному элементу - O (n).
Когда использовать вектор:
Когда использовать список:
~O(1)
для тех, кому это объяснение стоимости может быть полезным - stackoverflow.com/questions/200384/constant-amortized-time
просто быстрое примечание:
«Я читал, что Векторы - это не последовательность, а списки».
последовательности являются более общими, чем списки или векторы (или карты или множества).
К сожалению, REPL печатает списки и последовательности одинаково, потому что это действительно делает их похожими на списки, даже если они разные. Функция (seq) создаст последовательность из множества различных вещей, включая списки, и вы можете затем передать этот seq любому из множества функций, которые делают изящные вещи с помощью seqs.
user> (class (list 1 2 3))
clojure.lang.PersistentList
user> (class (seq (list 1 2 3)))
clojure.lang.PersistentList
user> (class (seq [1 2 3]))
clojure.lang.PersistentVector$ChunkedSeq
Sec имеет ярлык, который возвращает свой аргумент, если он уже является seq:
user> (let [alist (list 1 2 3)] (identical? alist (seq alist)))
true
user> (identical? (list 1 2 3) (seq (list 1 2 3)))
false
static public ISeq seq(Object coll){
if(coll instanceof ASeq)
return (ASeq) coll;
else if(coll instanceof LazySeq)
return ((LazySeq) coll).seq();
else
return seqFrom(coll);
}
списки являются последовательностями, хотя есть и другие вещи, и не все последовательности являются списками.
class
вместо class?
?
clojure.lang.PersistentList
для меня. Я предполагаю, что ты хотел написать class
нет class?
.
class
возвращает один и тот же PersistentList для обоих упомянутых вами выражений, это означает, что последовательности и списки действительно одно и то же?