Clojure地图是否包含级别规范?

时间:2013-11-21 21:21:52

标签: clojure clojure-contrib

尝试编写将函数(即inc,dec等)应用于输入向量元素的映射函数。输出是一个向量,函数应用于每个元素和索引元素。

以下是我要输入的示例: 输入1:[+ [[1 2] [3 4 5]] 2]

输出1:[[2 2] [3 4]] [[5 4] [6 6] [7 8]]]

输入2:[+ [1 2 3 4 5]]

输出2:[[2] [4] [6] [8] [10]]

符号表示: 输入2:[+ [a b c d e]]

输出2:[[1 + a] [2 + b] [3 + c] [4 + d] [5 + e]]

输入3:[加,[[[[[1]]]]]]

输出3:[[[[[[1 + 1]]]]](输出2但我写出了操作)

输入4:[加[[[[[1]]]]] 2] \

输出4:[[1 + [[[1]]] + [1 1]]]

1 个答案:

答案 0 :(得分:1)

clojure.core/map-indexed;它很相似,但不完全是你想要的。

E.g。

(map-indexed vector '[a b c]) ;=> '([0 a] [1 b] [2 c])

这非常接近我的想法:

(defn map-depth
  "Maps each element of s with an array of indices, as used by e.g. update-in,
   optionally at the given depth"
  ([f s depth path]
   (if (or (and depth (zero? depth))
           (not (sequential? s)))
     (f s path)
     (map-indexed (fn [i e]
                    (map-depth f e
                               (when depth (dec depth))
                               (conj path i)))
                  s)))
  ([f s depth]
   (map-depth f s depth []))
  ([f s]
   (map-depth f s nil [])))

E.g。

(map-depth vector '[a [b c] d])  ;=> '([a [0]] ([b [1 0]] [c [1 1]]) [d [2]])
(map-depth vector '[a b c] 0)             ;=> '[[a b c] []]
(map-depth vector '[[a b] [a b] [a b]] 1) ;=> '([[a b] [0]] [[a b] [1]] [[a b] [2]])

你是否来自Mathematica背景?

重要的是要记住,Clojure的+运算符不能与列表很好地匹配。

在Mathematica中你可以做到

{1, 2, 3, 4} + 2 (* ->  {3 4 5 6} *)

但是Clojure会抱怨;你必须解决它。

(+ [1 2 3 4] 2) ;=> ClassCastException
(map (partial + 2) [1 2 3 4]) ;=> (3 4 5 6)