我正在尝试为 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:(包括 [[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]]
关于clojure - Clojure 中嵌套向量的映射函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20170619/