2012-02-05 9 views

Odpowiedz

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

nie będzie działać z dwóch powodów:

  • #(1) jest zero-argumentem anonimowa funkcja, więc nie będzie działać na mapie (która wymaga jednego argumentu funkcji w przypadku korzystania z jednego sekwencja wejściowa).
  • Nawet gdyby miał odpowiedni arsenał, nie zadziałałby, ponieważ próbuje wywołać stałą 1 w funkcji takiej jak (1) - spróbuj (#(1)), na przykład, jeśli chcesz zobaczyć ten błąd.

Oto kilka alternatyw, które będzie działać:

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

z powyższym uważam, że wersje używając constantly lub for powinny być preferowane - są bardziej przejrzyste i idiomatyczne.

+0

' (mapa (stale 1) [1 3 5 7]) 'wydaje się być właściwą drogą jednak, jeśli próbujesz uzyskać sekwencję 1, której długość jest równa długości sekwencji, której mapujesz: '(repeat (count [1 3 5 7]) 1) także. To naprawdę wszystko zależy od kontekstu, w którym używasz tego jako konkretnego problemu, który próbujesz rozwiązać. –

9

mam to od clojure.org przez googling słowa "clojure funkcją stałą" jak ja dopiero zaczynają patrzeć na Clojure

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

okrzyki

+0

Clojure wypożyczył 'stale' z Common Lisp: http://www.lispworks.com/documentation/HyperSpec/Body/f_cons_1.htm – seh

11

Anonimowa funkcja #(+ 10 %1) odpowiada:

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

Podczas gdy #(1) jest odpowiednikiem:

 
(fn [] 
    (1)) 

Próbowanie wywołania 1 jako funkcji bez argumentów po prostu nie zadziała.

Powiązane problemy