Учитывая следующее:
user> (map (fn [x] (map #(* x %) '(1 2))) '(2 3)) ((2 4) (3 6))
Вкратце, как я могу изменить это идиоматически, чтобы получился результат:
(2 4 3 6)
Я использовал списки для иллюстрации, но любая коллекцияхорошо.
(mapcat (fn [x] (map #(* x %) '(1 2))) '(2 3))
Что является сокращением для:
(apply concat (map (fn [x] (map #(* x %) '(1 2))) '(2 3)))
concat объединяет коллекции в одну последовательность. Вызов его с помощью apply позволяет передать коллекцию коллекций для объединения.
concat
apply
Я мог бы использовать mapcat здесь, как Джастин, но во многих подобных случаях for - отличный инструмент для создания коллекций. Например, я думаю, что это довольно разборчивый способ написания вашей функции:
mapcat
for
repl-1=> (for [x '(2 3) repl-1=* factor '(1 2)] repl-1=* (* x factor)) (2 4 3 6)