在Clojure中,我如何将所有内容映射到一个恒定值?

时间:2012-02-05 23:24:36

标签: clojure

例如

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

将为所有内容添加10

假设我想将所有内容映射到常量1.我试过

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

但我不了解编译错误。

3 个答案:

答案 0 :(得分:14)

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

不会有两个原因:

  • #(1)是一个零参数的匿名函数,因此它不适用于map(当与一个输入序列一起使用时需要一个参数函数)。
  • 即使它有正确的arity,它也行不通,因为它试图将常量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])

在上述内容中,我认为使用constantlyfor的版本应该是首选 - 这些版本更清晰,更具惯用性。

答案 1 :(得分:11)

匿名函数#(+ 10 %1)相当于:

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

#(1)相当于:

(fn []
  (1))

尝试将1作为一个没有args的函数调用就行不通了。

答案 2 :(得分:9)

我是从clojure.org得到的 通过谷歌搜索" clojure常数函数"因为我刚开始看clojure

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

欢呼声