2014-12-03 3 views
0

Ну я новичок в Clojure и я просматривал литературу функции mapcat в (http://clojuredocs.org/clojure.core/mapcat), и я нашел следующий образец:Может ли кто-нибудь объяснить мне следующий пример?

(mapcat (fn [[k v]] 
       (for [[k2 v2] v] 
        (concat [k k2] v2))) 
     '{:a {:x (1 2) :y (3 4)} 
      :b {:x (1 2) :z (5 6)}}) 

((:a :x 1 2) (:a :y 3 4) (:b :x 1 2) (:b :z 5 6)) 

Я пытался понять, но я запутался, как же ключ и значения работают, я не уверен, что такое точное значение k, k2, v и v2, когда функции for и concat используют их.

Благодарим за помощь.

ответ

0

Функция применяется к каждому набору ключей для входящей карты. [[k v]] разрушает кортеж, так что в первом случае k будет иметь значение :a и v значение {:x (1 2) :y (3 4)}.

для цикла итерации через кортежей в v, DESTRUCTURING снова, так что в первом случае, k2 будет :x и v2 будет (1 2).

Это передается Concat, так что наша первая запись будет (:a :x 1 2)

1

Возможно, этот пример поможет вам понять, что mapcat делает, но это не большой пример хорошо написанного кода: это довольно запутанным способ, чтобы написать много-проще

(for [[k v] '{:a {:x (1 2) :y (3 4)} 
       :b {:x (1 2) :z (5 6)}} 
     [k2 v2] v] 
    (list* k k2 v2)) 

Смешивание mapcat и for вместе в том же месте, делает его более трудным, чтобы увидеть, что все, что происходит это вложенная последовательность понимания.

Смежные вопросы