【问题标题】:Clojure - Calling a function on a vector of vectorsClojure - 在向量的向量上调用函数
【发布时间】:2017-08-23 15:14:03
【问题描述】:

我有一个向量[[1 2 3 4] [5 6]],我想在这个向量上调用函数double来得到[[1.0 2.0 3.0 4.0] [5.0 6.0]]

我可以做(mapv (fn [x] (mapv double x)) [[1 2 3 4] [5 6]]) 这会给我想要的东西

我想知道是否有更好/更快的方法来做到这一点。

谢谢

【问题讨论】:

  • 与幽灵:(transform [ALL ALL] double [[1 2 3 4] [5 6]])
  • or clojure/walk: (clojure.walk/prewalk #(if (number? %) (double %) %) data) ,它还允许您转换任意深度的集合

标签: clojure


【解决方案1】:

我不知道我一定会称它为“更好”,但我个人偏好在必须嵌套调用 map 时使用 for。我个人觉得它更具可读性。

(def vecs [[1 2 3 4] [5 6]])

(for [r vecs] (for [x r] (double x)))

数据以列表形式返回,我假设将其保存在向量中并不是特别重要。如果你这样做,那么它的可读性就会降低一些,我可能更喜欢你的方法。

(vec (for [r vecs] (vec (for [x r] (double x)))))

【讨论】:

  • ... 或者,(defmacro forv [& stuff] (list 'vec (cons 'for stuff))),只需 (forv [r vecs] (forv [x r] (double x)))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
相关资源
最近更新 更多