2013-04-30 8 views

risposta

9

leggere la documentazione di apply:

user=> (doc apply) 
------------------------- 
clojure.core/apply 
([f args] [f x args] [f x y args] [f x y z args] [f a b c d & args]) 
    Applies fn f to the argument list formed by prepending intervening arguments to args. 
nil 

Quindi, (apply map vector (vec jpgList)) corrisponde a f x args, quindi sarà applicata alla funzione vector, seguito dagli elementi di (vec jpgList)map. A differenza di Haskell, Clojure map supporta più raccolte su cui operare. (vec jpgList) è presumibilmente un vettore annidata, o elenco, come nel seguente esempio:

user=> (apply map vector [[1 2 3] [4 5 6]]) 
([1 4] [2 5] [3 6]) 

È successo, ogni elemento prodotto dalla map è il vettore di ciascun elemento ennesimo degli elementi del vettore annidata. Questa funzione è nota anche come transpose nelle operazioni con matrici.

5

apply accetta una funzione e i relativi argomenti. Se chiamato con più di due argomenti, gli argomenti centrali verranno aggiunti come argomenti scalari (come l'uso parziale). Vedere the documentation for apply

In altre parole, tutti e quattro di questi sono gli stessi:

(apply (partial map vector) [[1 2 3 4] "abcd"]) 
(apply map [vector [1 2 3 4] "abcd"]) 
(apply map vector [[1 2 3 4] "abcd"]) 
(map vector [1 2 3 4] "a b c d") 

Tutto tornerà ([1 \a] [2 \b] [3 \c] [4 \d]).

2

Solo "map viene applicato". Tuttavia, il primo argomento su map è sempre esso stesso una funzione. In questo caso, vector viene anteposto alla sequenza di argomenti prodotta da (vec jpgList). vector qui non è una seconda funzione applicata, è il primo argomento nella sequenza a cui viene applicato map insieme al resto.

Vedrete questo linguaggio spesso quando si applica una funzione di ordine superiore che a sua volta prende una funzione come argomento.