Clojure中嵌套向量上的映射函数

Clojure中嵌套向量上的映射函数,clojure,clojure-contrib,Clojure,Clojure Contrib,我正试图为Clojure编写一个更通用的映射函数,但无法在嵌套向量上映射函数。特别是映射应该允许参数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是输入函数,[…]

我正试图为Clojure编写一个更通用的映射函数,但无法在嵌套向量上映射函数。特别是映射应该允许参数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“包裹”在每个元素和每个向量周围

我不明白您为什么要这样做,但这可能会满足您的需求:

(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]]

我无法理解你的例子。
[f[f[a]f[b]]f[f[c]f[d]]
是什么意思?我认为
n
(“嵌套的级别规范”)参数会说明向量嵌套的深度,但这似乎不是示例中的情况。n的目的是指定要映射的级别。对于像[[[1 2 3]]]这样的嵌套向量,可以选择n=3。如果f代表函数,那么您应该期望[f[f[f[1]f[2]f[3]]]。您的符号仍然没有意义。
[f[f[f[1]f[2]f[3]]]
应该是什么意思?查看段[f[1]f[2]f[3]]需要将函数映射到向量中的每个元素,即
(map inc[1 2 3])
。然后f,或inc,将映射到产生[3 4 5]的向量[2 3 4]。因为这里n是3,所以输出将产生[4 5 6]。