Как я могу поместить вывод карты в одну коллекцию - PullRequest
0 голосов
/ 31 января 2012

Учитывая следующее:

user> (map (fn [x] (map #(* x %) '(1 2))) '(2 3))  
((2 4) (3 6))

Вкратце, как я могу изменить это идиоматически, чтобы получился результат:

(2 4 3 6)

Я использовал списки для иллюстрации, но любая коллекцияхорошо.

Ответы [ 2 ]

5 голосов
/ 31 января 2012
(mapcat (fn [x] (map #(* x %) '(1 2))) '(2 3))

Что является сокращением для:

(apply concat (map (fn [x] (map #(* x %) '(1 2))) '(2 3)))

concat объединяет коллекции в одну последовательность. Вызов его с помощью apply позволяет передать коллекцию коллекций для объединения.

3 голосов
/ 31 января 2012

Я мог бы использовать mapcat здесь, как Джастин, но во многих подобных случаях for - отличный инструмент для создания коллекций. Например, я думаю, что это довольно разборчивый способ написания вашей функции:

repl-1=> (for [x      '(2 3)
repl-1=*       factor '(1 2)]
repl-1=*   (* x factor))
(2 4 3 6)
...