Відповіді:
Ще раз, здається, я відповів на власне запитання, нетерплячи і задавши його в #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) створить послідовність з безлічі різних речей, включаючи списки, і ви зможете подавати цю послідовність в будь-яку з безлічі функцій, які роблять вишукані речі з допомогою послідовностей.
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 є ярлик, який повертає його аргумент, якщо це вже послідовно:
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 для обох цих виразів, які ви згадали, це означає, що послідовності та списки - це саме те саме?