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