2012-09-19 15 views
5

Possiedo un vettore di funzioni (def my-func [a b c d]). Ogni funzione prende l'output dell'ultima funzione come input. Voglio infilarci un input attraverso di loro, come posso farlo?threading attraverso un vettore di funzioni

Come si arriva al seguente modulo (-> in a b c d)?

Grazie, Murtaza

risposta

5

È possibile utilizzare comp ma essere consapevoli che esegue le funzioni di destra a sinistra

((comp d c b a) 10) 

o

((apply comp my-fns) 10) 

passerà 10 alla prima funzione, il risultato alla funzione successiva e così via.

+0

Grazie per l'elegante soluzione Fabbro. – murtaza52

+0

Prego. Esiste un'altra funzione, ['juxt'] (http://clojuredocs.org/clojure_core/clojure.core/juxt) che accetta un numero di funzioni come argomenti e applica gli argomenti a ciascuna funzione restituendo un vettore di risultati' ((juxt + - * /) 3 2) => [5 1 6 3/2] ' –

5

Penso che si può utilizzare la funzione reduce:

(def fns [inc inc inc]) 
(reduce (fn [v f] (f v)) 10 fns) 
+0

Grazie dAni, questo è un modo meraviglioso! – murtaza52

+0

Questo mi ricorda di cosa stava parlando @fogus in [Thrush in Clojure] (http://blog.fogus.me/2010/09/28/thrush-in-clojure-redux/) –

Problemi correlati