(def ops '(+ - * /))
(map #(% 2 5) ops)
dàApplicare un elenco di funzione per il parametro, clojure
(5 5 5 5)
Questo non ha senso per me. Perché restituisce una lista di 5 invece dei risultati delle chiamate di funzione?
(def ops '(+ - * /))
(map #(% 2 5) ops)
dàApplicare un elenco di funzione per il parametro, clojure
(5 5 5 5)
Questo non ha senso per me. Perché restituisce una lista di 5 invece dei risultati delle chiamate di funzione?
Il problema è che '(+ - * /)
è un elenco di simboli, non un elenco di funzioni. I simboli implementano AFn
e quando vengono forniti con due argomenti, la funzione tenta di cercare il simbolo nel primo argomento (2
qui) e restituisce il secondo argomento (5
qui) se la ricerca fallisce.
C'è una funzione in clojure che fa esattamente quello che vuoi: juxt
: http://clojuredocs.org/clojure.core/juxt
Così il vostro esempio può essere
(def funcs (juxt + - * /))
(funcs 2 5)
Se qualcuno esce con una buona spiegazione per questo l'approccio map
non lo fa lavoro mi piacerebbe sentire anche questo.
Questo funziona: (map #(% 2 5) [+ - * /])
Questo non lo fa: (map #(% 2 5) '[+ - * /])
Né questo: (map #(% 2 5) '(+ - * /))
La ragione è che quando si fa '(+ - * /)
, si ottiene una lista dei simboli +, - * e /, non le funzioni a cui si riferiscono - la citazione si applica anche ai valori della lista.
L'utilizzo di un vettore evita questo problema.
Se si desidera assolutamente un elenco, fare (map #(% 2 5) (list + - * /))
.
Questa è una risposta più approfondita alla mia domanda, completata dalla soluzione fornita da @bsvingen. – user40129