clojure - secuencias - ora-08002 la secuencia todavía no se ha definido en esta sesión
Aplicando secuencia de funciones a una secuencia de valores (2)
Si está dispuesto a modificar ligeramente el formato de sus valores, las cosas se vuelven un poco más simples:
user=> (map apply [inc dec] [[98] [8]])
(99 7)
Es necesario porque apply
debe tener un seq como último argumento. Esta transformación ( [98 8]
=> [[98] [8]]
) parece una opción razonable de todos modos, ya que de lo contrario depende del hecho de que las funciones solo pueden tomar un valor cada una. Por supuesto, es trivial:
user=> (map list [98 8])
((98) (8))
De lo contrario, la función #(%1 %2)
de mapeo de Joost #(%1 %2)
es tan concisa como la que obtendrás.
Deseo aplicar por parejas una lista de funciones a una lista 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)
Tenga en cuenta que tuve 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 una manera más natural de hacer esto? Realmente me gustaría utilizar el mapa para definir una función auxiliar.
Siempre puede definir funciones de forma anónima, en línea:
(map (fn [f x] (f x)) [inc dec] ''(98 8))
o más corto, usando la macro del lector # ():
(map #(%1 %2) [inc dec] ''(98 8))
Sin embargo, es un caso de uso bastante incómodo, así que dudo que pueda reducirlo a algo más corto utilizando 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)