我正在尝试为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“包裹”在每个元素和每个向量周围。
答案 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]]