2011-12-02 17 views
7

Tiene que haber una manera simple de hacerlo, y obviamente me falta: |Agregar elementos en una lista/secuencia en Clojure

¿Cómo se agregan los elementos en una lista \ secuencia (no está claro en la diferencia) en clojure?

He intentado lo siguiente:

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

te refieres a '(aplicar + [1 2 3])'? –

+0

Sí, @NathanHughes: eso es lo que estaba buscando. No sé por qué no pude entender algo tan simple, pero sí, eso fue todo. – javamonkey79

Respuesta

9
(+ 1 2 3) 

... lo hará. La solución de @ Nathan Hughes:

(apply + [1 2 3]) 

... funciona si usted tiene una referencia a la secuencia en lugar de definirlo en línea, por ejemplo:

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

Como @ notas 4E6, reduce funciona también:

(reduce + s) ; 6 

Cual es mejor? Opinions vary.

+1

Creo que '(reduce + [1 2 3])' es más idiomático. – 4e6

+0

@ 4e6: [Usted puede estar en lo cierto.] (Http://stackoverflow.com/questions/3153396/clojure-reduce-vs-apply) –

+0

'apply +' funciona, gracias. – javamonkey79

Cuestiones relacionadas