Jawaban:
Sekali lagi, sepertinya saya sudah menjawab pertanyaan saya sendiri dengan menjadi tidak sabar dan menanyakannya di #clojure di Freenode. Untung menjawab pertanyaan Anda sendiri dianjurkan di Stackoverflow.com: D
Saya berdiskusi singkat dengan Rich Hickey, dan inilah intinya.
[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
Jika Anda sudah sering melakukan pemrograman Java, dan terbiasa dengan kerangka koleksi Java, pikirkan daftar like LinkedList
, dan vektor like ArrayList
. Jadi Anda bisa memilih wadah dengan cara yang sama.
Untuk klarifikasi lebih lanjut: jika Anda berniat untuk menambahkan item satu per satu ke bagian depan atau belakang urutan, daftar yang ditautkan jauh lebih baik daripada vektor, karena item tidak perlu dikocok setiap kali. Namun, jika Anda ingin mendapatkan elemen tertentu (tidak dekat bagian depan atau belakang daftar) sering (yaitu, akses acak), Anda akan ingin menggunakan vektor.
Omong-omong, vektor dapat dengan mudah diubah menjadi seqs.
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
tanpa, secara efektif, mengimplementasikan kembali ArrayDeque
diri Anda.
Vektor memiliki O (1) waktu akses acak, tetapi mereka harus preallocated. Daftar dapat diperpanjang secara dinamis, tetapi mengakses elemen acak adalah O (n).
Kapan harus menggunakan vektor:
Kapan harus menggunakan daftar:
~O(1)
, bagi mereka yang memerlukan penjelasan biaya ini - stackoverflow.com/questions/200384/constant-amortized-time
hanya catatan singkat:
"Saya membaca bahwa Vektor bukan seqs, tetapi Daftar adalah."
urutan lebih umum daripada daftar atau vektor (atau peta atau set).
Sangat disayangkan bahwa REPL mencetak daftar dan urutan yang sama karena itu benar-benar membuatnya terlihat seperti daftar adalah urutan meskipun mereka berbeda. fungsi (seq) akan membuat urutan dari banyak hal yang berbeda termasuk daftar, dan Anda kemudian dapat memberi makan seq ke salah satu dari banyak fungsi yang melakukan hal-hal bagus dengan 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 memiliki pintasan yang mengembalikan argumennya jika sudah 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);
}
daftar adalah urutan, meskipun hal-hal lain juga, dan tidak semua urutan adalah daftar.
class
bukan class?
?
clojure.lang.PersistentList
untuk saya. Saya berasumsi Anda bermaksud untuk class
tidak menulis class?
.
class
mengembalikan PersistentList yang sama untuk kedua ekspresi yang Anda sebutkan ini, ini menyiratkan bahwa urutan dan daftar memang hal yang sama persis?