2012-02-05 9 views
7

Per esempioIn Clojure, come dovrei mappare tutto ad un valore costante?

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

aggiungerà 10 a tutto

Supponiamo che io voglio per mappare tutto al costante 1. Ho provato

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

Ma io non capisco l'errore del compilatore .

+1

Se si verifica un errore del compilatore, è una buona idea includerlo nella domanda in modo che le persone possano aiutarla più facilmente. – mikera

risposta

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

non funziona per due motivi:

  • #(1) è una funzione anonima zero argomento, quindi non funzionerà con la mappa (che richiede una funzione one-argomento quando utilizzato con una sola sequenza di input).
  • Anche se avesse il diritto, non funzionerebbe perché sta tentando di chiamare la costante 1 come una funzione come (1) - prova ad esempio se vuoi vedere questo errore.

Qui ci sono alcune alternative che funzionano:

; 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]) 

Di quanto sopra, credo che le versioni utilizzando constantly o for dovrebbe essere preferito - questi sono più chiare e più idiomatica.

+0

' (mappa (costantemente 1) [1 3 5 7]) 'sembra il modo giusto per andare, comunque, se stai solo cercando di ottenere una sequenza di 1s la cui lunghezza è uguale alla lunghezza della sequenza su cui stai mappando: '(ripeti (conta [1 3 5 7]) 1)' funzionerebbe anche. Dipende tutto dal contesto in cui stai usando questo particolare problema che stai cercando di risolvere. –

9

ho ricevuto questo da clojure.org googling le parole "funzione clojure costante" come sto appena cominciando a guardare clojure

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

applausi

+0

Clojure preso in prestito 'costantemente da Common Lisp: http://www.lispworks.com/documentation/HyperSpec/Body/f_cons_1.htm – seh

11

La funzione anonima #(+ 10 %1) è equivalente a:

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

considerando che #(1) è equivalente a:

 
(fn [] 
    (1)) 

E provare a chiamare 1 come una funzione senza argomenti non funziona.

Problemi correlati