2013-11-22 69 views
1

給定一個函數,向量或數組以及等級規範作爲輸入。 Clojure輸出函數的成對線程的最簡單方法是什麼?給定兩個向量我第一次嘗試具有等級規格的線程陣列

(vec (interleave [:a :b] [1 2])) 
[:a 1 :b 2] 

對於數組我用

(vec (map interleave [[:a :b] [:c :d]] [[1 2] [3 4]])) 
[(:a 1 :b 2) (:c 3 :d 4)] 

這並不完全輸出的陣列。 這是一個函數的成對線程的正確方法嗎?

這裏是什麼,我試圖做

輸入1樣本:[+ [1 2] [3 4]] [[1 2] [3 4] 2]

輸出1:[[2 4] [6 8]]

輸入2:[+ [1 2 3 4] [1 2 3 4]]

輸出2:[2 4 6 8]

+0

這不是一個Clojure的陣列是什麼。在clojure中,數組是一個固定長度的可變java對象,通常不需要它們。你指定的是一個嵌套向量。 – noisesmith

回答

2

將遞歸深度指定爲數字參數似乎很奇怪,因爲使用平坦的原因相同是可疑的:它可能是一個解決方法,因爲您沒有充分理解或正確指定創建您正在操作的結構的算法。

對於初學者來說,要映射子序列,可以使用嵌套調用映射。

此外,如果您想要地圖創建矢量(並且渴望,這是矢量創建的副作用),則可以使用mapv

(mapv (partial mapv +) [[1 2] [3 4]] [[1 2] [3 4]]) 

現在嘗試使用數字參數爲mapv遞歸深度:

user> 
(defn mapdepth-rec 
    [depth f & args] 
    (if (= depth 1) 
    (apply mapv f args) 
    (apply mapv (partial mapdepth-rec (dec depth) f) args))) 

#'user/mapdepth-rec 
user> 
(defn mapdepth [f a b & [depth]] (let [depth (or depth 1)] (mapdepth-rec depth f a b))) 

#'user/mapdepth 
user> (mapdepth + [[1 2] [3 4]] [[1 2] [3 4]] 2) 
[[2 4] [6 8]] 
user> (mapdepth + [1 2 3 4] [1 2 3 4]) 
[2 4 6 8]