1

给定一个函数、向量或数组,以及作为输入的级别规范。Clojure 中输出函数的成对线程的最简单方法是什么?给定我第一次尝试的两个向量

(vec (interleave [:a :b] [1 2]))
[:a 1 :b 2]

对于我使用的数组

(vec (map interleave [[:a :b] [:c :d]] [[1 2] [3 4]]))
[(:a 1 :b 2) (:c 3 :d 4)]

这并不完全输出一个数组。这是对函数进行成对线程的正确方法吗?

这是我正在尝试做的一个示例

输入 1:[+ [[1 2] [3 4]] [[1 2] [3 4]] 2]

输出 1:[[2 4] [6 8]]

输入 2:[+ [1 2 3 4] [1 2 3 4]]

输出2:[2 4 6 8]

4

1 回答 1

2

将递归深度指定为数字参数似乎很奇怪,出于同样的原因,使用 flatten 是可疑的:它可能是一种解决方法,因为您没有充分理解或正确指定创建您正在操作的结构的算法上。

对于初学者,要映射子序列,您可以使用嵌套调用来映射。

此外,如果您希望 map 创建一个矢量(并且渴望,这是矢量创建的副作用),您可以使用mapv.

(mapv (partial mapv +) [[1 2] [3 4]] [[1 2] [3 4]])

现在尝试使用数字参数来表示 mapv 递归的深度:

user> 
(defn mapdepth-rec
  [depth f & args]
  (if (= depth 1)
    (apply mapv f args)
    (apply mapv (partial mapdepth-rec (dec depth) f) args)))

#'user/mapdepth-rec
user> 
(defn mapdepth [f a b & [depth]] (let [depth (or depth 1)] (mapdepth-rec depth f a b)))

#'user/mapdepth
user> (mapdepth + [[1 2] [3 4]] [[1 2] [3 4]] 2)
[[2 4] [6 8]]
user> (mapdepth + [1 2 3 4] [1 2 3 4])
[2 4 6 8]
于 2013-11-22T05:05:15.060 回答