2011-03-20 55 views
10

有關地圖Clojure中的第一個奇怪的是在下面的代碼片段:怪事Clojure中的地圖功能

(apply map list '((1 a) (2 b) (3 c))) 

結果是令人驚訝的對我說:

((1 2 3) (a b c)) 

任何人都可以解釋它是如何工作的?

+1

這是一個很好的問題,併產生了一個非常有用的答案(如何轉置一個Clojure seq),但標題並不特別清楚幫助人們找到這個問題。如果沒有@Dfr或其他人的話,我會有興趣改進它。 – 2014-01-22 20:20:44

回答

23

(apply f x '(y z))相當於(f x y z),所以您的代碼相當於(map list '(1 a) '(2 b) '(3 c))

當用多個列表進行調用時,map並行地迭代列表並且爲每個元素從每個列表中的一個元素調用給定的函數(即,結果列表的第一個元素是調用帶有第一個元素的函數的結果每個列表作爲參數,第二個是第二個元素的結果等)。

因此,(map list '(1 a) '(2 b) '(3 c))首先調用list與列表的第一個元素(即數字)作爲參數,然後與第二個元素(字母)。所以你得到((list 1 2 3) (list 'a 'b 'c))

+0

是的,我發現地圖壓縮多個集合的能力非常有用。請注意,如果您知道要壓縮多少個集合,則可以使用%n來引用第n個集合中的元素,例如(地圖#(myfun%1( - %2%3))'(1 2)'(2 3)'(3 4)) – 2011-03-21 08:48:41