Что делает zip-карта Clojure?
Я новичок в Clojure, и мне нужна помощь с этой функцией. Если бы вы могли сказать мне, что эта функция делает и как она работает, я был бы очень благодарен.
(defn zip-map
[k v]
(into{} (map vec (partition 2 (interleave k v)))))
2 ответа
Решение
Пример использования:
(zip-map [:a :b :c] [1 2 3]) ;=> {:a 1, :b 2, :c 3}
И изнутри:
(interleave [:a :b :c] [1 2 3]) ;=> (:a 1 :b 2 :c 3)
(partition 2 '(:a 1 :b 2 :c 3)) ;=> ((:a 1) (:b 2) (:c 3))
(map vec '((:a 1) (:b 2) (:c 3))) ;=> ([:a 1] [:b 2] [:c 3])
(into {} '([:a 1] [:b 2] [:c 3])) ;=> {:a 1, :b 2, :c 3}
Функция является более сложной, поэтому ее сложнее понять, чем нужно. Это можно написать так:
(defn zip-map [ks vs]
(into {} (map vector ks vs)))
когда
(zip-map [:a :b :c] [1 2 3])
;{:a 1, :b 2, :c 3}
как прежде.
Функция имитирует стандарт zipmap
Вы можете найти объяснение, в комплекте с исходным кодом, в официальных документах или ClojureDocs, который также дает примеры. Оба этих сайта помогут вам выбрать свой словарь Clojure.
Как это часто бывает, стандартная функция быстрее, хотя и сложнее, чем простая однострочная строка выше.