В clojure, как создать список, применяя 2 разные функции на коллекции векторов из 2 элементов? - PullRequest
1 голос
/ 22 февраля 2012

В Clojure у меня есть коллекция coll векторов с 2 элементами. Я хотел бы создать коллекцию, полученную путем применения f и g к первому и второму элементам каждого вектора коллекции, соответственно. Я думаю, что это связано с конструкцией списка .

(def coll [[1 1000] [2 2000] [3 3000]])

Есть ли идиоматический способ создания следующего результата?

 [[f(1) g(1000)] [f(2) g(2000)] [f(3) g(3000)]]

Ответы [ 3 ]

5 голосов
/ 22 февраля 2012

Опять же, понимание списка FTW:

(vec (for [[x y] [[1 1000] [2 2000] [3 3000]]] [(f x) (g y)]))
4 голосов
/ 22 февраля 2012

Да,

(vec (map (fn [[p1 p2]] [(f p1) (g p2)])
          [[1 1000] [2 2000] [3 3000]]))
1 голос
/ 22 февраля 2012

Чтобы написать это с нуля, я бы сделал именно то, что сделал skuro - это просто, легко и читабельно.Но я также написал функцию более высокого порядка, чтобы абстрагировать это некоторое время назад, с именем knit .Так что теперь я бы написал это как

(map (knit f g) [[1 1000] [2 2000] [3 3000]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...