Clojure - 通过所有级别的地图

时间:2012-12-12 23:54:28

标签: clojure

我正在尝试创建一个遍历每个元素并应用操作的map函数。它就像map函数一样,但深入人心。

该功能需要两个参数;一个函数和一个参数。

这是我到目前为止所做的:

(defn go-through
 [op & args]
   (if-not (sequential? (first args))
     (apply op args)
     (apply (partial map go-through op) args)))

我知道即使没有打电话,最后一行也行不通。但我不知道怎么回事。

建议?


也许我限制了这种功能的用途。

样品:

user=> (go-through + 1 2)
3
user=> (go-through + [1 2] [3 4])
IllegalArgumentException Don't know how to create ISeq from: clojure.core$_PLUS_     clojure.lang.RT.seqFrom (RT.java:494)

我期待[4 6]

这个想法适用于任何对单个元素进行操作的函数,而不是顺序元素。

2 个答案:

答案 0 :(得分:2)

这可能是你的解决方案:

(defn go-through [op & args]
   (if-not (sequential? (first args))
     (apply op args)
     (apply map op args)))

(go-through + 1 2 3)
-> 6

(go-through + [1 2] [3 4] [5 6])
-> (9 12)

版本2(修复原始示例)

(defn go-through [op & args]
   (if-not (sequential? (first args))
     (apply op args)
     (apply map (partial go-through op) args)))

(go-through + [[1 2] [3 4]] [[5 6] [7 8]])
-> ((6 8) (10 12))

答案 1 :(得分:0)

请注意,您的第一行既不会起作用,因为“if”条件只是检查第一个参数是否是顺序,然后调用op将是所有参数。

我建议使用http://richhickey.github.com/clojure/clojure.walk-api.html或查看其代码;)