Clojure中嵌套向量上的映射函数
我正试图为Clojure编写一个更通用的映射函数,但无法在嵌套向量上映射函数。特别是映射应该允许参数n,它允许嵌套的级别规范 以下是我到目前为止所写的内容,它在嵌套向量中失败: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是输入函数,[…]
(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]。