【问题标题】:Map with repeated argument clojure具有重复参数 clojure 的映射
【发布时间】:2014-04-04 15:31:27
【问题描述】:

以下面的函数为例:

(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 的最佳方式是什么?

【问题讨论】:

  • 使用mapv而不是map,你会得到另一个向量。 map 的懒惰在这里买不到任何东西。

标签: clojure


【解决方案1】:

只需申请partial函数

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

【讨论】:

  • 感谢您的回答,但这不使用我现有的功能 f。我如何在函数 f 中使用 partial?
  • @user2179977 只需将+ 替换为f
  • 在我给出的示例中,将参数传递给 f 的顺序并不重要,因为它只是添加它们。如果排序很重要,例如(defn f [x y] (x - y)),该怎么办?如果我给partial提供一个参数,它怎么知道是x还是y
  • 如果我想给它第二个并映射第一个怎么办?
  • 匿名函数是你的朋友#(- x %)
【解决方案2】:

方法一:使用repeat

(repeat 2) 给你一个无限 2s 的惰性序列

在你的情况下,

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

应该转换成

(map f [1 2 6 3 6] (repeat 2))

方法二:使用匿名函数

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

【讨论】:

  • 谢谢,我喜欢方法 1,因为它使用我的函数 f 而方法 2 没有。
  • 你也可以使用(map #(f % 2) [1 2 6 3 6])来使用你的函数f
  • 太棒了!选择方法 1 还是方法 2 有什么好的理由吗?
  • 他们是两种不同的想法,取决于f是什么功能。在这种情况下,我会选择第二个。
  • 我想说,如果性能无关紧要,请使用看起来更容易理解的任何选项(包括 partial,正如 mishadoff 建议的那样)。如果性能确实很重要,请对选项进行基准测试(使用 Criterium)。有时最快的方法不是您所期望的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 2015-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多