2012-12-12 33 views
1

我试图创建一个映射函数,通过每个元素并应用操作。它就像一个map函数,但深入。Clojure - 通过所有级别的地图

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

这是我到目前为止有:

(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]

的想法是这个应用与单元素,而不是sequentials操作的任何功能。

+0

你能不能包括一个样本输入和输出?它应该保留树结构还是生成一个seq? –

+0

@ArthurUlfeldt,它应该保留树结构。 – Zchpyvr

+0

你想要[4 6]还是[3 7]? – DanLebrero

回答

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)) 
+0

- 删除评论 - – Zchpyvr

+0

@Zpypyvr有一个错误。我刚刚修好了。 – mobyte

+0

对不起,实际上,这种解决方案不能工作超过两个深度。 – Zchpyvr

0

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

我会建议使用http://richhickey.github.com/clojure/clojure.walk-api.html或看一下它的代码;)

+0

....出于某种原因,我使用它的方式,第一行的作品,它只是“其他”。请参阅上面的输出。 – Zchpyvr