clojure - Clojure 中嵌套向量的映射函数

标签 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 是输入函数,[[...]] 是嵌套向量,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/

相关文章:

clojure - 创建 deps.edn 文件时出现问题

java - 正则表达式:匹配所有连字符,并用空格替换仅包含字母且不在引号内的单词

emacs - 显示结果时 CIDER REPL 中的多余滚动

clojure - 使用 clojure 读取大型命令输出

java - ClojureScript 编译器如何将 cljs 转换为 Javascript

clojure - 我如何依赖每个 clojure contrib 库?

file-io - 从文件读取时在clojure中拆分行

clojure - 实现 Clojure 协议(protocol)时,重载方法能否调用其重载对应项?

clojure - 在 clojure 函数名称中使用 - 和 *

clojure - Clojure 中的 block 对角矩阵