在Clojure中通过嵌套向量映射函数

时间:2013-11-24 03:07:18

标签: clojure clojure-contrib

我正在尝试为Clojure编写一个更通用的map函数,但是无法在嵌套向量上映射函数。特别地,地图应该允许参数n,其允许嵌套的级别规范。

这是我到目前为止所写的内容,它使用嵌套向量失败:

(defn cloj-maps 
([f x]     (vec (map f x)))
([f x y]   (vec (map f x y)))
([f x y z] (vec (map f x y z))))

以下是我尝试输入/输出的示例:

输入1:(inc [[1 2] [3 4]] 1)其中inc是输入函数,[[...]]是嵌套向量,1是级别指定。

输出1:[[2 3] [4 5]]

符号[f [a b] f [c d]],它位于顶层。

输入2:(inc [[1 2] [3 4]] 2)

输出2:[[3 4] [5 6]]

符号[f [f [a] f [b]] f [f [c] f [d]]]其中我使用f作为函数,并替换{1,2,3,4} - > {A B C D}。 这里输入参数2意味着在级别1和2处的映射,因此f“包裹”在每个元素和每个向量周围。

1 个答案:

答案 0 :(得分:3)

我不明白为什么你想要这样做,但这可能会做你想要的:

(defn cloj-maps [f n x]
  (let [f' (nth (iterate #(comp f %) identity) n)]
    ((fn deep [y]
        (if (vector? y)
          (mapv deep y)
          (f' y)))
       x)))

示例输出:

user=> (cloj-maps inc 0 [[1 2] [3 4]])
[[1 2] [3 4]]
user=> (cloj-maps inc 1 [[1 2] [3 4]])
[[2 3] [4 5]]
user=> (cloj-maps inc 2 [[1 2] [3 4]])
[[3 4] [5 6]]
user=> (cloj-maps inc 3 [[1 2] [3 4]])
[[4 5] [6 7]]
user=> (cloj-maps inc 4 [[1 2] [3 4]])
[[5 6] [7 8]]