2014-10-10 27 views
2

请帮我用Clojure开始。我已经搜索和阅读,但我看到的是如何使用函数inc添加号码1如何映射将参数加5的函数?

我想了解map的基础知识。我想要做的就是将值5添加到集合中的每个元素。我尝试了许多不同的方法,但没有结果。这是一个可悲的不完整的企图:

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

这必须是幼稚简单,但不适合像我这样的非功能性的程序员。

谢谢。

回答

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]) 
+0

谢谢。中间一个是我的目标。 – Alex 2014-10-10 18:23:12

+0

也:'(地图(部分+ 5)[0 1 2])' – dsm 2014-10-23 01:09:22

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文档中也有6个例子。这是为斯卡拉,但SO上的here's another answer,解释地图和减少(左褶)相当不错。

+1

非常感谢您的解决方案和参考! – Alex 2014-10-10 18:39:23

1

使用部分应用程序(见partial)来创建一个功能,增加了5到它的参数:

(partial + 5) 

你可以自己尝试一下:

user> ((partial + 5) 10) 
;; => 15 

现在映射它在你的名单:

user> (map (partial + 5) [0 1 2]) 
;; => [5 6 7]