Câu trả lời:
Một lần nữa, dường như tôi đã trả lời câu hỏi của chính mình bằng cách thiếu kiên nhẫn và hỏi nó trong #clojure trên Freenode. Điều tốt là trả lời câu hỏi của riêng bạn được khuyến khích trên Stackoverflow.com: D
Tôi đã có một cuộc thảo luận nhanh với Rich Hickey, và đây là ý chính của nó.
[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
Nếu bạn đã thực hiện lập trình Java rất nhiều và quen thuộc với khung bộ sưu tập Java, hãy nghĩ đến các danh sách như LinkedList
và các vectơ như thế nào ArrayList
. Vì vậy, bạn có thể khá nhiều lựa chọn container theo cùng một cách.
Để làm rõ hơn: nếu bạn có ý định thêm các mục riêng lẻ vào phía trước hoặc phía sau của chuỗi nhiều, một danh sách được liên kết sẽ tốt hơn nhiều so với một vectơ, bởi vì các mục không cần phải xáo trộn mỗi lần. Tuy nhiên, nếu bạn muốn nhận được các phần tử cụ thể (không ở gần mặt trước hoặc mặt sau của danh sách) thường xuyên (nghĩa là truy cập ngẫu nhiên), bạn sẽ muốn sử dụng vectơ.
Nhân tiện, vectơ có thể dễ dàng biến thành 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
không, một cách hiệu quả, ArrayDeque
tự thực hiện lại chính mình.
Các vectơ có O (1) thời gian truy cập ngẫu nhiên, nhưng chúng phải được đặt trước. Danh sách có thể được mở rộng động, nhưng truy cập một yếu tố ngẫu nhiên là O (n).
Khi nào nên sử dụng vectơ:
Khi nào nên sử dụng danh sách:
~O(1)
, đối với những người mà giải thích chi phí này có thể hữu ích - stackoverflow.com/questions/200384/constant-amortized-time
chỉ là một ghi chú bên nhanh:
"Tôi đọc rằng vectơ không phải là seqs, nhưng Danh sách thì có."
trình tự chung chung hơn danh sách hoặc vectơ (hoặc bản đồ hoặc bộ).
Thật không may là REPL in danh sách và trình tự giống nhau bởi vì nó thực sự làm cho nó trông giống như danh sách là trình tự mặc dù chúng khác nhau. Hàm (seq) sẽ tạo một chuỗi từ rất nhiều thứ khác nhau, bao gồm cả danh sách, và sau đó bạn có thể cung cấp seq đó cho bất kỳ rất nhiều chức năng thực hiện những điều tiện lợi bằng 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 có một phím tắt trả về đối số của nó nếu nó đã là một 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);
}
danh sách là các chuỗi, mặc dù những thứ khác cũng vậy, và không phải tất cả các chuỗi đều là danh sách.
class
thay vì class?
?
clojure.lang.PersistentList
cho tôi. Tôi cho rằng bạn có nghĩa là class
không viết class?
.
class
trả về cùng một PersistentList cho cả hai biểu thức bạn đã đề cập, điều này ngụ ý rằng các chuỗi và danh sách có thực sự giống nhau không?