2011-03-27 11 views
7

Deseo aplicar por parejas una lista de funciones a una lista de valores.Aplicación de la secuencia de funciones a una secuencia de valores

Aquí hay un ejemplo para ilustrar.

user=> (defn a [f x] (f x)) 
#'user/a 
user=> (map a [inc dec] '(98 8)) 
(99 7) 

Aviso Tengo que definir una función a que toma una función y la aplica a un valor. Básicamente, la aplicación de la función de abstracción.

¿Hay alguna forma más natural de hacerlo? Realmente me gustaría utilizar el mapa para definir una función auxiliar.

Respuesta

8

Puede definir siempre funciona de manera anónima, en línea:

(map (fn [f x] (f x)) [inc dec] '(98 8)) 

o más corto, utilizando el #() lector de macro:

(map #(%1 %2) [inc dec] '(98 8)) 

Es un caso de uso bastante incómoda aunque, por lo que la duda puede reducirlo a algo más corto usando solo clojure o clojure.contrib, pero puede escribir fácilmente su propia abstracción:

(defn mapfs [fs coll] (map #(%1 %2) fs coll)) 
(mapfs [inc dec] [98 8]) 
> (99 7) 
5

Si usted está dispuesto a modificar ligeramente el formato de los valores, las cosas se ponen un poco más simple:

user=> (map apply [inc dec] [[98] [8]]) 
(99 7) 

Es necesario porque hay que tener un apply siguientes como su último argumento. Esta transformación ([98 8] =>[[98] [8]]) parece una opción razonable de todos modos, ya que de lo contrario dependerá del hecho de que las funciones solo pueden tomar un valor cada una. Es por supuesto trivial para hacer:

user=> (map list [98 8]) 
((98) (8)) 

De lo contrario, la función de mapeo de Joost #(%1 %2) es tan conciso como vas a conseguir.

Cuestiones relacionadas