带重复参数的映射clojure

带重复参数的映射clojure,clojure,Clojure,以以下函数为例: (defn f [x y] (+ x y)) 我想使用此函数向向量的每个元素添加2: [1 2 6 3 6] 我可以使用地图: (map f [1 2 6 3 6] [2 2 2 2 2]) 但是,创建第二个向量,其中每个元素都完全相同,这似乎有点难看 所以我认为使用闭包是更好的方法: (map (fn g [x] (f x 2)) [1 2 6 3 6]) 所以我的问题是: 在clojure中,当某些参数不变时,使用map的最佳方法是什么?方法1:使用 (重复2)为您

以以下函数为例:

(defn f [x y] (+ x y))
我想使用此函数向向量的每个元素添加2:

[1 2 6 3 6]
我可以使用地图:

(map f [1 2 6 3 6] [2 2 2 2 2])
但是,创建第二个向量,其中每个元素都完全相同,这似乎有点难看

所以我认为使用闭包是更好的方法:

(map (fn g [x] (f x 2)) [1 2 6 3 6])
所以我的问题是:


在clojure中,当某些参数不变时,使用map的最佳方法是什么?

方法1:使用

(重复2)
为您提供无限
2
s的惰性序列

就你而言

(map f [1 2 6 3 6] [2 2 2 2 2])
应转换为

(map f [1 2 6 3 6] (repeat 2))
方法2:使用匿名函数

(map #(f % 2) [1 2 6 3 6])

只需应用
partial
函数

(map (partial + 2) [1 2 6 3 6]) => (3 4 8 5 8)

谢谢你的回答,但这不使用我现有的函数f。我将如何在函数f中使用partial?@user2179977只需将
+
替换为
f
,在我给出的示例中,参数传递给f的顺序无关紧要,因为它只是在添加它们。如果排序很重要,例如
(defn f[xy](x-y))
,该怎么办?如果我为
partial
提供一个参数,它如何知道它是
x
还是
y
?如果我想给它第二个参数并映射到第一个参数呢?匿名函数是你的朋友
(-x%)
谢谢,我喜欢方法1,因为它使用我的函数f,而方法2不使用。你也可以使用
(映射)(f%2)[1 2 6 3 6])
使用你的函数
f
。太好了!选择方法1和方法2有什么好的理由吗?它们是两种不同的想法,取决于
f
是哪种函数。在这种情况下,我会选择第二种。我会说,如果性能不重要,请使用更容易理解的选项(包括mishadoff建议的
partial
)。如果性能确实重要,请对选项进行基准测试(使用标准)。有时最快的方法并不是你所期望的。使用
mapv
而不是
map
,你会得到另一个向量。
map
的懒惰在这里买不到任何东西。