2009-11-08 15 views
6

Il Clojure distinto? metodo non prende una collezione, ma piuttosto un elenco di argomentiCome posso usare Clojure's distinto? funzione su una collezione?

(distinct? x) 
(distinct? x y) 
(distinct? x y & more) 

Così (distinta? 0 0 0 0) restituisce correttamente falsa, mentre (distinti? [0 0 0 0]) restituisce true. Come posso distinguere lo ? su una raccolta in modo che passandole una raccolta [0 0 0 0] restituirebbe false poiché la raccolta contiene duplicati?

Mi rendo conto che la funzione sta funzionando correttamente, ma sto cercando un trucco per applicarlo ai contenuti di una raccolta invece di una lista di argomenti.

Per aggirare il problema, ho attualmente

(defn coll-distinct? [coll] 
    (= (distinct coll) coll)) 

ma mi sento come mi manca un modo più elegante riutilizzare distinti?

+0

lol, un trucco per 'applicare' per il contenuto – gtrak

risposta

16

Se si desidera passare argomenti come un seq a una funzione, utilizzare apply.

(apply distinct? [1 2 3 1]) 
; false 
(apply distinct? [1 2 3]) 
; true 
+0

come sarebbe questo lavoro nel caso in cui la raccolta è vuota? –

+0

@KenLiu non esiste una forma 'distinta'? 0-arity, quindi '(apply distinct? [])' Genera un "Wrong number of args (0)" ArityException, uguale a '(distinct?)'. Confronta questo con '+', che ha una forma 0-arity: '(+)' e '(apply + [])' entrambi restituiscono '0'. – chbrown

Problemi correlati