请帮我用Clojure开始。我已经搜索和阅读,但我看到的是如何使用函数inc
添加号码1
。如何映射将参数加5的函数?
我想了解map
的基础知识。我想要做的就是将值5
添加到集合中的每个元素。我尝试了许多不同的方法,但没有结果。这是一个可悲的不完整的企图:
(map (+ 5 ???) [0 1 2])
这必须是幼稚简单,但不适合像我这样的非功能性的程序员。
谢谢。
请帮我用Clojure开始。我已经搜索和阅读,但我看到的是如何使用函数inc
添加号码1
。如何映射将参数加5的函数?
我想了解map
的基础知识。我想要做的就是将值5
添加到集合中的每个元素。我尝试了许多不同的方法,但没有结果。这是一个可悲的不完整的企图:
(map (+ 5 ???) [0 1 2])
这必须是幼稚简单,但不适合像我这样的非功能性的程序员。
谢谢。
map
的第一个参数是要应用于输入序列中每个元素的函数。您可以创建一个功能,它供给:
(defn plus5 [x] (+ 5 x))
(map plus5 [0 1 2])
,如果你不想申报命名函数,你可以在线例如创建一个匿名
(map (fn [x] (+ 5 x)) [0 1 2])
,并可以缩短函数定义:
(map #(+ 5 %) [0 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文档中也有6个例子。这是为斯卡拉,但SO上的here's another answer,解释地图和减少(左褶)相当不错。
非常感谢您的解决方案和参考! – Alex 2014-10-10 18:39:23
使用部分应用程序(见partial
)来创建一个功能,增加了5
到它的参数:
(partial + 5)
你可以自己尝试一下:
user> ((partial + 5) 10)
;; => 15
现在映射它在你的名单:
user> (map (partial + 5) [0 1 2])
;; => [5 6 7]
谢谢。中间一个是我的目标。 – Alex 2014-10-10 18:23:12
也:'(地图(部分+ 5)[0 1 2])' – dsm 2014-10-23 01:09:22