В Clojure, как бы я отобразил все на постоянное значение? - PullRequest
7 голосов
/ 06 февраля 2012

Например

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

добавит 10 ко всему

Предположим, я хочу сопоставить все с константой 1. Я попробовал

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

Но я не понимаю ошибку компилятора.

Ответы [ 3 ]

14 голосов
/ 06 февраля 2012
(map #(1) [ 1 3 5 7 ])

Не будет работать по двум причинам:

  • #(1) - анонимная функция с нулевым аргументом, поэтому она не будет работать с картой (для которой требуется функция с одним аргументом)при использовании с одной входной последовательностью).
  • Даже если бы он имел правильную арность, он не работал бы, потому что он пытался вызвать константу 1 как функцию, подобную (1) - попробуйте (#(1)), напримересли вы хотите увидеть эту ошибку.

Вот несколько альтернатив, которые будут работать:

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

Из вышесказанного, я думаю, версии, использующие постоянно или для должно быть предпочтительным - они более понятны и более идиоматичны.

11 голосов
/ 06 февраля 2012

Анонимная функция #(+ 10 %1) эквивалентна:

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

Принимая во внимание, что #(1) эквивалентно:

(fn []
  (1))

И попытка вызвать 1 как функцию без аргументов просто не будет работать.

9 голосов
/ 06 февраля 2012

Я получил это от clojure.org прибегая к помощи слов "постоянная функция clojure", как я только начинаю смотреть на clojure

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

ура

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...