带重复参数的映射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
的懒惰在这里买不到任何东西。