2011-12-02 23 views
7

Deve esserci un modo semplice per farlo, e ovviamente mi manca: |Aggiungere elementi in una lista/sequenza in Clojure

Come si aggiungono gli elementi in un elenco \ sequenza (non chiaro sulla differenza) in clojure?

Ho provato la seguente:

Clojure> (add [1 2 3]) 
java.lang.RuntimeException: Unable to resolve symbol: add in this context 
Clojure> (+ [1 2 3]) 
java.lang.ClassCastException: Cannot cast clojure.lang.PersistentVector to java.lang.Number 
Clojure> (apply merge-with + [1 2 3]) 
java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Long 
Clojure> (add-items [1 2 3]) 
java.lang.RuntimeException: Unable to resolve symbol: add-items in this context 
+2

intendi come '(applica + [1 2 3])'? –

+0

Sì, @NathanHughes - questo è quello che stavo cercando. Non so perché non sia riuscito a capire qualcosa di così semplice, ma sì - è stato così. – javamonkey79

risposta

9
(+ 1 2 3) 

... lo farà. La soluzione di @ Nathan Hughes:

(apply + [1 2 3]) 

... funziona se si dispone di un riferimento alla sequenza piuttosto che definirla in linea, ad esempio:

(def s [1 2 3]) 
; (+ s) CastClassException 
(apply + s) ; 6 

Come @ note 4E6, reduce funziona anche:

(reduce + s) ; 6 

Quale è meglio? Opinions vary.

+1

Credo che '(reduce + [1 2 3])' sia più idiomatico. – 4e6

+0

@ 4e6: [Potresti aver ragione]. (Http://stackoverflow.com/questions/3153396/clojure-reduce-vs-apply) –

+0

'apply +' funziona, grazie. – javamonkey79

Problemi correlati