2011-03-20 14 views
10

la primera cosa extraña sobre un mapa en clojure está en siguiente fragmento:rareza en función de mapa clojure

(apply map list '((1 a) (2 b) (3 c))) 

El resultado es sorprendente para mí:

((1 2 3) (a b c)) 

Cualquiera podía explicar cómo funciona?

+1

Esta es una gran pregunta y generó una respuesta muy útil (cómo transponer una secuencia de Clojure), pero el título no es particularmente claro al ayudar a las personas a encontrar esta pregunta. Me gustaría mejorarlo, si eso está bien con @Dfr u otros. –

Respuesta

23

(apply f x '(y z)) es equivalente a (f x y z), por lo que su código es equivalente a (map list '(1 a) '(2 b) '(3 c)).

Cuando se llama con múltiples listas, itera las listas en paralelo y llama a la función dada con un elemento de cada lista para cada elemento (es decir, de cada lista como sus argumentos, el segundo es el resultado de los segundos elementos, etc.).

Entonces (map list '(1 a) '(2 b) '(3 c)) llama primero a list con los primeros elementos de las listas (es decir, los números) como argumentos y luego con los segundos elementos (las letras). Entonces obtienes ((list 1 2 3) (list 'a 'b 'c)).

+0

Sí, creo que la capacidad del mapa para comprimir múltiples colecciones es extremadamente útil. Tenga en cuenta que si sabe cuántas colecciones está comprimiendo, puede usar% n para referirse al elemento de la enésima colección, p. (map # (myfun% 1 (-% 2% 3)) '(1 2)' (2 3) '(3 4)) –