2011-12-15 59 views
3

我一直在使用Clojure玩弄,並決定將結合會員名:mapcat和列表來模擬這種行爲高階函數:傳遞的變量列表中逐個到Clojure的功能

Clojure> (mapcat list '(1 2 3 4) '(5 6 7 8)) 
(1 5 2 6 3 7 4 8) 

我第一次嘗試定義mapcatList如下:

Clojure> (defn mapcatList[& more](mapcat list more)) 
#'sandbox99/mapcatList 
Clojure> (mapcatList '(1 2 3 4) '(5 6 7 8)) 
((1 2 3 4) (5 6 7 8)) 

顯然函數不表現我怎麼會喜歡它,我覺得這是因爲兩個列表都被放進一個列表,並通過作爲一個參數,而不是兩個。 我可以用下面的亡羊補牢,

Clojure> (defn mapcatList[x y & more](mapcat list x y)) 
#'sandbox99/mapcatList 
Clojure> (mapcatList '(1 2 3 4) '(5 6 7 8)) 
(1 5 2 6 3 7 4 8) 

該解決方案具有兩個列表效果很好,但我想在功能與參數的數量可變的工作。

我的問題:如何將一個可變數量的參數傳遞給一個函數,然後將它們解構爲使它們作爲單獨的參數一起傳遞給'mapcat list'?

+0

(defn mapcatList [&more](apply mapcat list more)) – vedang 2011-12-15 16:50:45

回答

13

您正在尋找apply。這用一個序列中提供的參數調用一個函數。

但是你是否知道有一個函數interleave,它正是你的mapcatList所要做的?

+0

是的,我是。這整個事情開始後,我試圖實現交錯我自己。謝謝。 – wespiserA 2011-12-15 17:36:02

5

你是對的,由於vararg聲明,參數被包裝在一個列表中。您需要apply的參數,以解開的參數列表:

(defn mapcatList[& more] 
    (apply mapcat list more)) 

user=> (mapcatList '(1 2 3 4) '(5 6 7 8))    
(1 5 2 6 3 7 4 8) 
user=> (mapcatList '(1 2 3 4) '(5 6 7 8) '(\a \b \c \d)) 
(1 5 \a 2 6 \b 3 7 \c 4 8 \d)