2014-05-03 18 views
8

tôi đang học Clojure, và tôi thấy chút mã này trực tuyến:Clojure điều cơ bản: đếm tần số

(count (filter #{42} coll)) 

Và nó, như đã nói, đếm lần xuất hiện của số 42 trong coll. #{42} có hoạt động không? Các tài liệu Clojure trên bộ lọc nói rằng nó nên được, kể từ khi đoạn mã hoạt động như quảng cáo. Tôi không biết nó hoạt động như thế nào. Nếu ai đó có thể làm rõ điều này cho tôi, điều đó thật tuyệt. giải pháp của riêng tôi để cùng một điều này có thể đã được:

(count (filter #(= %1 42) coll)) 

Làm thế nào đến chức năng lọc của tôi có ngoặc và đoạn tôi tìm thấy trực tuyến có dấu ngoặc nhọn xung quanh chức năng lọc (#(...) vs #{...})?

+0

Bạn đã thấy câu trả lời này chưa? http://stackoverflow.com/questions/3249334/test-whether-a-list-contains-a-specific-value-in-clojure – Jonas

+0

Không, tôi chưa thấy câu trả lời đó. Tôi có thể thấy rằng họ cũng đang sử dụng các mã tương tự. Cũng có đề cập rằng '(# {x} x)' trả về 'x'. Tôi không hiểu '# {x}' đang làm gì như một hàm. Đó không phải chỉ là một bộ? – vim

+0

Xem câu trả lời của tôi. Một bộ không chỉ là một bộ - trong số những thứ khác nó là một IFN để bạn có thể coi nó như một hàm. – pete23

Trả lời

16
=> #{42} 
#{42} 

Định nghĩa một tập ...

=> (type #{42}) 
clojure.lang.PersistentHashSet 

=> (supers (type #{42})) 
#{clojure.lang.IHashEq java.lang.Object clojure.lang.IFn ...} 

Điều thú vị là các thiết lập thực hiện IFN để bạn có thể đối xử với nó như một hàm. Hành vi của hàm là "nếu mục này tồn tại trong tập hợp, trả về nó".

=> (#{2 3} 3) 
3 
=> (#{2 3} 4) 
nil 

Các bộ sưu tập khác như bản đồ và vector đứng trong các chức năng theo cách tương tự, truy xuất bằng khóa hoặc chỉ mục khi thích hợp.

=> ({:x 23 :y 26} :y) 
26 
=> ([5 7 9] 1) 
7 

Ngọt ngào, phải không? :-)

1

Vâng, #{42} là một chức năng,

  • bởi vì nó là một tập hợp, và các bộ, giữa khả năng khác, là chức năng: họ thực hiện các giao diện clojure.lang.IFn.
  • Áp dụng cho bất kỳ giá trị nào trong tập hợp, chúng sẽ trả về giá trị đó; áp dụng cho bất cứ điều gì khác, họ trả lại nil.
  • Vì vậy, #{42} kiểm tra xem đối số của nó là 42 (chỉ nilfalse là sai, hãy nhớ).

Cách Clojure là làm cho tất cả mọi thứ một chức năng mà có thể hữu ích là một:

  • Sets làm việc như một bài kiểm tra cho thành viên.
  • Bản đồ hoạt động như tra cứu chính.
  • Vectors hoạt động như tra cứu chỉ mục.
  • Từ khóa hoạt động như tra cứu trong đối số bản đồ.

này

  • thường giúp bạn tiết kiệm một get,
  • cho phép bạn, như trong câu hỏi, để vượt qua cấu trúc dữ liệu thường chức năng bậc cao như filtermap, và
  • trong trường hợp từ khóa, cho phép bạn di chuyển trong suốt giữa các bản đồ và hồ sơ để giữ dữ liệu của bạn.
Các vấn đề liên quan