具有级别规范的线程数组

时间:2013-11-22 01:51:11

标签: clojure clojure-contrib

给定函数,向量或数组,并将级别规范作为输入。在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]

1 个答案:

答案 0 :(得分:2)

要指定递归的深度,因为数字参数似乎很奇怪,因为使用flatten的相同原因是可疑的:它可能是一个解决方法,因为您没有充分理解或正确指定创建结构的算法你正在经营。

首先,要映射子序列,可以使用嵌套调用进行映射。

此外,如果您希望地图创建一个矢量(并且渴望,这是矢量创建的副作用),您可以使用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]