2012-10-09 16 views
8
(def tmp = [ 1 2 3 9 4 8]) 

Estoy tratando de crear pares de 2, luego, para cada par, restar el segundo número del primero. resultado deseado: (1 6 4)mapa de clojure sobre secuencia de pares

Aquí es lo que estaba tratando:

(map #(apply - %2 %1) (partition 2 tmp)) 

cómo puedo hacer esto?

+0

En el ejemplo, parece que restas el * primer * número del * segundo *, no al revés, ¿verdad? –

Respuesta

10

La partición produce una secuencia de secuencias, por lo que la función que usted asigna debe esperar una secuencia de dos elementos. Hay varias maneras de expresar esto:

(def tmp [ 1 2 3 9 4 8]) 

user> (map #(- (second %) (first %)) (partition-all 2 tmp)) 
(1 6 4) 

user> (map #(apply - (reverse %)) (partition-all 2 tmp)) 
(1 6 4) 

user> (map (fn [[small large]] (- large small)) (partition-all 2 tmp)) 
(1 6 4) 

La versión usando aplica es diferente, ya que seguirá siendo "trabajo" en las listas de longitud impar:

user> (map #(apply - (reverse %)) (partition-all 2 [1 2 3 4 5 6 7])) 
(1 1 1 -7) 

Los otros se colgará en la entrada no válida, que le puede preferir

+0

+1 en la solución que usa la desestructuración – noahlz

2

Aquí es una solución utilizando reduce

(reduce #(conj %1 (apply - (reverse %2))) [] (partition-all 2 [1 2 3 9 4 8])) 
=> [1 6 4] 
+1

(reducir (conj ...)) es una forma genial de expresar una versión no perezosa del mapa. Consulte la nueva biblioteca de reductores para obtener más información sobre este tema: http://clojure.com/blog/2012/05/08/reducers-a-library-and-model-for-collection-processing.html si usted es interesado –

0

Me pregunto por qué esta solución se pasó por alto ...

Desde que cambió el orden de la resta es simplemente el negativo de la sustracción original, (ab = - (ba)), la solución se vuelve más eficiente (sólo en este caso particular !!)

(map #(- (apply - %)) (partition-all 2 [1 2 3 9 4 8])) 

vista pedagógico, la solución de Arthur es correcto. Esta es solo una solución más adecuada para la pregunta específica.

Cuestiones relacionadas