从Clojure序列的每个元素中减去n

时间:2018-11-12 08:51:28

标签: clojure

我认为这是一个非常简单的问题,但是我似乎无法在线找到答案:如何从Clojure序列的每个元素中减去n?例如,从(6 9 11)的每个元素中减去4,得到(2 5 7)?

我认为应该使用map完成此操作,并且我知道对于减1的特殊情况,我可以(map dec (sequence))做,但是对于其他情况我该怎么做呢?

对于它的价值,我最终发现(map - (map (partial - n) (sequence))在技术上确实有效,但是显然这并不是要完成的。


对于在搜索中落入此处并有稍微不同的问题的任何人:如果要从 n中减去Clojure序列的每个元素,则可以使用(map (partial - n) (sequence))

类似地,要将Clojure序列的每个元素乘以n,您可以执行(map (partial * n) (sequence))

用于将n添加到Clojure序列(map (partial + n) (sequence))的每个元素中

我在these Clojure docs中找到了这个答案,所以我认为这是惯用的,但是显然我自己不能为此提供担保。

3 个答案:

答案 0 :(得分:2)

在这里方便使用匿名函数文字:

> (map #(- % 4) [6 9 11])
(2 5 7)

#(- % 4)形式是

中匿名函数的简写形式
> (map (fn [x] (- x 4)) [6 9 11])
(2 5 7)

答案 1 :(得分:0)

如果您要为所需的功能寻找combinatory表达式,请尝试(comp - (partial - 4))

=> (map (comp - (partial - 4)) '(6 9 11))
(2 5 7)

请记住,+-只是普通的命名Clojure函数。您所需的功能可能不值得命名,因此您可以直接将其表示为#(- % 4)(fn [n] (- n 4))或以上形式。

还应该记住map是惰性的,因此可以处理无尽的序列:

=> (take 10 (map (comp - (partial - 4)) (range)))
(-4 -3 -2 -1 0 1 2 3 4 5)

答案 2 :(得分:-1)

这可以通过地图来实现。 Clojure映射采用函数和列表作为参数。 Synatax:

  

(地图(函数)(序列))

test=> (map (fn[arg] (- arg 4) ) '(7 8 9) )
(3 4 5)
test=> (map (fn[arg] (- arg 4) ) [7 8 9] )
(3 4 5)

地图也可以使用简写形式。

  

(-%4)

。这里%是参数传递。默认为第一个参数。 %1明确地说出第一个参数

test=> (map #(- %1 4) [7 8 9])
(3 4 5)
test=> (map #(- % 4) [7 8 9])
(3 4 5)