2012-02-05 15 views
7

Por ejemploEn Clojure, ¿cómo mapearía todo a un valor constante?

(map #(+ 10 %1) [ 1 3 5 7 ]) 

a añadir 10 a todo lo

Supongamos que quiero para mapear todo para la constante 1. He intentado

(map #(1) [ 1 3 5 7 ]) 

pero no comprender el error del compilador .

+1

Si obtiene un error de compilación, es una buena idea incluir esto en la pregunta para que las personas puedan ayudarlo más fácilmente. – mikera

Respuesta

14
(map #(1) [ 1 3 5 7 ]) 

no funcionará por dos razones:

  • #(1) es una función anónima sin argumentos, por lo que no va a trabajar con el mapa (que requiere una función de un argumento cuando se utiliza con una secuencia de entrada).
  • Incluso si tuviera la razón correcta, no funcionaría porque está tratando de llamar a la constante 1 como una función como (1) - pruebe (#(1)) por ejemplo si quiere ver este error.

Estas son algunas de las alternativas que trabajarán:

; use an anonymous function with one (ignored) argument 
(map (fn [_] 1) [1 3 5 7]) 

; a hack with do that ignores the % argument 
(map #(do % 1) [1 3 5 7]) 

; use a for list comprehension instead 
(for [x [1 3 5 7]] 1) 

; use constantly from clojure.core 
(map (constantly 1) [1 3 5 7]) 

De lo anterior, creo que las versiones usando constantly o se debe preferir for - estos son más claras y más idiomática.

+0

' (mapa (constantemente 1) [1 3 5 7]) 'parece ser la manera correcta para ir, sin embargo, si solo está tratando de obtener una secuencia de 1s cuya longitud es igual a la longitud de la secuencia que está mapeando: '(repetir (contar [1 3 5 7]) 1)' funcionaría también. Realmente todo depende del contexto en el que estás usando esto como el problema particular que estás tratando de resolver. –

9

llegué esto desde clojure.org buscando en Google las palabras "función clojure constante", como yo estoy empezando a mirar clojure

(map (constantly 9) [1 2 3]) 

aplausos

+0

Clojure prestado 'constantemente' de Common Lisp: http://www.lispworks.com/documentation/HyperSpec/Body/f_cons_1.htm – seh

11

La función anónima #(+ 10 %1) es equivalente a:

 
(fn [%1] 
    (+ 10 %1)) 

Considerando que #(1) es equivalente a:

 
(fn [] 
    (1)) 

Y tratando de llamar 1 como una función sin args simplemente no funcionará.

Cuestiones relacionadas