polecam zrobić to ze zmniejszenia się następująco:
(defn count-truthy [coll]
(reduce (fn [cnt val] (if val (inc cnt) cnt)) 0 coll))
powody korzystania zmniejszyć w ten sposób:
- Jest prawdopodobne, aby być bardziej wydajne i będą korzystać z nowej funkcjonalności Clojure za reduktorów, które umożliwia fakt, zmniejsza w wielu kolekcjach
- unika tworzenia sekwencję pośrednią (co by było, gdyby użyto leniwe funkcję sekwencji takiego filtra)
Jeśli masz już zrealizowane sekwencję, wówczas następujące jest również dobrym rozwiązaniem, ponieważ będzie ona korzystać z prymitywnego arytmetyki w pętli:
(defn count-truthy [coll]
(loop [s (seq coll) cnt 0]
(if s
(recur (next s) (if (first s) (inc cnt) cnt))
cnt)))
nie duplicate - zliczanie wartości i zwracanie ich to inna operacja (i ma kilka całkiem różnych rozwiązań) – mikera