3

我正在尝试为 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[ab] f[cd]] 映射在顶层。

输入 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 ,光盘}。这里的输入参数 2 意味着在级别 1 和 2 的映射,因此 f “包裹”在每个元素和每个向量周围。

4

1 回答 1

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]]
于 2013-11-24T05:15:30.753 回答