请帮我用Clojure开始。我已经搜索过并阅读了,但我看到的是如何使用函数1
添加数字inc
。
我试图理解map
的基础知识。我想要做的就是将值5
添加到集合中的每个元素。我尝试了很多不同的方法,但没有什么可以接近的。这是一个可怜的不完整尝试:
(map (+ 5 ???) [0 1 2])
这一定非常简单,但不适合像我这样的非功能性程序员。
感谢。
答案 0 :(得分:3)
map
的第一个参数是您要应用于输入序列中每个元素的函数。你可以创建一个函数并提供它:
(defn plus5 [x] (+ 5 x))
(map plus5 [0 1 2])
如果你不想声明一个命名函数,你可以创建一个内联的匿名函数,例如。
(map (fn [x] (+ 5 x)) [0 1 2])
您可以将函数定义缩短为:
(map #(+ 5 %) [0 1 2])
答案 1 :(得分:2)
(+ 5 ???)
是一个表达式,而不是函数。
(defn foo [x] (+ 5 x))
是一个命名函数。
(fn [x] (+ 5 x))
是一个匿名函数。
#(+ 5 %)
是编写匿名函数的更快捷方式。
这些行做你想要的:
(map foo [0 1 2])
(map (fn [x] (+ 5 x)) [0 1 2])
(map #(+ 5 %) [0 1 2])
我在查看我以前从未见过的语言时,有时会发现this site有用。如果您搜索"功能,"您将找到有关如何定义它们的整个部分。 map
的官方Clojure文档中还有六个例子。这是针对Scala的,但here's another answer在SO上解释了map并减少了(左侧折叠)。
答案 2 :(得分:1)
使用部分应用程序(请参阅partial
)创建一个向其参数添加5
的函数:
(partial + 5)
您可以自己尝试一下:
user> ((partial + 5) 10)
;; => 15
现在将其映射到您的列表:
user> (map (partial + 5) [0 1 2])
;; => [5 6 7]