2011-03-20 31 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