2011-03-04 12 views
6

Si tengo que proporcionar un valor constante a una función que estoy mapeo de los elementos de una secuencia, hay una manera mejor que lo que estoy haciendo en la actualidad:Mapeo sobre la secuencia con una constante

(map my-function my-sequence (cycle [my-constant-value])) 

donde my-constant-value es una constante en el sentido de que va a ser el mismo para las asignaciones sobre mi secuencia, aunque puede ser el resultado de alguna función más allá. Me da la sensación de que más tarde veré lo que estoy preguntando aquí y creo que es una pregunta tonta porque si estructurara mi código de manera diferente, no sería un problema, ¡pero ahí está!

Respuesta

7

En su caso me gustaría utilizar una función anónima:

(map #(my-function % my-constant-value) my-sequence) 

Utilizando una función parcialmente aplicada es otra opción, pero no tiene mucho sentido en este escenario particular:

(map (partial my-function my-constant-value) my-sequence) 

Debería (¿quizás?) Redefinir my-function para tomar el valor constante como primer argumento, y no tiene que aceptar una cantidad variable de argumentos, por lo que usar partial no le compra nada.

1

sip :) una pequeña joya de la sección "other useful functions" de la API constantly

(mapear mi-mi-función secuencia (mi-constantemente de valor constante))

el patrón de (mapa compines-data algo-new a-constant) es bastante común en idlojatic clojure. es relativly rápido también con secuencias fragmentadas y tal.

EDIT: esta respuesta es incorrecta, pero constantly y el resto de la api de "otras funciones útiles" son tan geniales que me gustaría dejar la referencia aquí para ellos de todos modos.

+1

devuelve constantemente una función, no un siguientes: 'clojure.core/repetir ([ x] [n x]) Devuelve una secuencia de xs.' – skuro

+0

lenta (¡infinito !, o longitud n si se proporciona), es mejor para este trabajo –

9

Me tienden a utilizar la herramienta parcial o una función anónima como dbyrne sugiere, pero sí para tener en cuenta es repeat, que devuelve una secuencia infinita de cualquier valor que quiera:

(map + (range 4) (repeat 10)) 
=> (10 11 12 13) 
4

embargo, otra forma que a veces me resulta más fácil de leer que map es la lista de macros for comprensión:

(for [x my-sequence] 
    (my-function x my-constant-value)) 
Cuestiones relacionadas