У меня есть следующий код, который увеличивает первый элемент каждой пары в векторе:
(vec (map (fn [[key value]] [(inc key) value]) [[0 :a] [1 :b]]))
Однако я боюсь, что этот код неэлегантен, так как он сначала создает последовательность с использованием карты, а затем возвращает ее обратно в вектор.
Рассмотрим этот аналог:
(into [] (map (fn [[key value]] [(inc key) value]) [[0 :a] [1 :b]]))
На # clojure @irc.freenode.net мне сказали, что использование вышеприведенного кода плохо, потому что into
расширяется в (reduce conj [] (map-indexed ...))
, что создает много промежуточных объектов в процессе. Затем мне сказали, что на самом деле into
не распространяется на (reduce conj ...)
и использует переходные процессы, когда это возможно. Также измеренное прошедшее время показало, что into
на самом деле быстрее, чем vec
.
Итак, мои вопросы:
- Каков правильный способ использования
map
над векторами? - Что происходит под ним, когда я использую
vec
иinto
с векторами?
Связанные, но не повторяющиеся вопросы: