2012-07-15 38 views
5
(conj (drop-last "abcde") (last "abcde")) 

lợi nhuận (\e \a \b \c \d)Ai đó có thể giải thích hành vi của "conj"?

Tôi bối rối. Trong tài liệu của conj, tôi nhận thấy

'Ngoài ra' có thể xảy ra ở các vị trí khác nhau tùy thuộc vào loại cụ thể.

Điều đó có nghĩa là đối với LazySeq, địa điểm để thêm mục mới có phải là đầu không? Làm cách nào tôi có thể nhận được kết quả là (\a \b \c \d \e)?

+0

có thể trùng lặp: http://stackoverflow.com/questions/7437833/inconsistency-with-clojures-sequences/7438355 – Gert

Trả lời

6

'The 'Ngoài' có thể xảy ra tại khác nhau 'nơi' tùy thuộc vào bê tông loại.'

Điều này đề cập đến hành vi của các bộ sưu tập liên tục của Clojure kết hợp việc bổ sung theo cách hiệu quả nhất liên quan đến hiệu suất và triển khai cơ bản.

Vectors luôn thêm vào phần cuối của bộ sưu tập:

user=> (conj [1 2 3] 4) 
[1 2 3 4] 

Với danh sách, conj đặt mục ở phía trước của danh sách, như bạn đã nhận thấy:

user=> (conj '(1 2 3) 4) 
(4 1 2 3) 

Vì vậy, có, một LazySeq được coi như một Danh sách liên quan đến việc thực thi cụ thể của nó.

Làm cách nào để nhận được (\a \b \c \d \e)?

Có một số cách khác nhau, nhưng bạn có thể dễ dàng tạo ra một vector từ LazySeq của bạn:

(conj (vec (drop-last "abcde")) 
     (last "abcde")) 
1

Điều quan trọng là nhận ra rằng conj chỉ đơn giản là đại biểu cho việc thực hiện cons trên giao diện IPersistentCollection trong Clojure của Java công cụ. Do đó, tùy thuộc vào cấu trúc dữ liệu đã cho được xử lý, nó có thể hoạt động khác nhau.

Mục đích đằng sau conj là nó sẽ luôn thêm một mục vào cấu trúc dữ liệu theo cách hiệu quả nhất.

Đối với danh sách, vị trí hiệu quả nhất để đặt nó là mặt trước. Đối với các vec-tơ, vị trí hiệu quả nhất để đặt nó là ở cuối.

Các vấn đề liên quan