如何映射一个为其参数添加5的函数?

时间:2014-10-10 18:03:17

标签: clojure lambda functional-programming

请帮我用Clojure开始。我已经搜索过并阅读了,但我看到的是如何使用函数1添加数字inc

我试图理解map的基础知识。我想要做的就是将值5添加到集合中的每个元素。我尝试了很多不同的方法,但没有什么可以接近的。这是一个可怜的不完整尝试:

(map (+ 5 ???) [0 1 2])

这一定非常简单,但不适合像我这样的非功能性程序员。

感谢。

3 个答案:

答案 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]