2012-12-12 84 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