tôi sẽ khuyên bạn nên làm điều này với giảm như sau:
(defn count-truthy [coll]
(reduce (fn [cnt val] (if val (inc cnt) cnt)) 0 coll))
lý do cho việc sử dụng giảm theo cách này:
- Nó có khả năng là hiệu quả hơn, và sẽ được hưởng lợi từ chức năng gia giảm mới Clojure của cho phép thực tế giảm trên nhiều bộ sưu tập
- Nó tránh tạo ra một chuỗi trung gian (mà sẽ xảy ra nếu bạn sử dụng một hàm chuỗi lười biếng như lọc)
Nếu bạn đã có một chuỗi nhận ra, thì sau đây cũng là một lựa chọn tốt, vì nó sẽ được hưởng lợi từ số học nguyên thủy trong vòng lặp:
(defn count-truthy [coll]
(loop [s (seq coll) cnt 0]
(if s
(recur (next s) (if (first s) (inc cnt) cnt))
cnt)))
không phải là một trùng lặp - đếm giá trị so với trả lại chúng là một hoạt động khác nhau (và có một số giải pháp khá khác nhau) – mikera