我是clojure的新手,我正在审查(http://clojuredocs.org/clojure.core/mapcat)函数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))
我试图理解,但我对键和值如何工作感到困惑,我不确定当函数和concat使用它们时k,k2,v和v2的确切值是什么。
感谢您的帮助。
答案 0 :(得分: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
混合在同一个地方会让人更难发现所发生的一切都是嵌套的序列理解。
答案 1 :(得分:0)
该函数应用于传入映射的每个键值元组。 [[k v]]
会对元组进行解构,因此在第一种情况下,k
的值为:a
,v
的值为{:x (1 2) :y (3 4)}
。
for循环遍历v
中的元组,再次进行解构,因此在第一种情况下,k2
将为:x
而v2
将为{{1} }}
这将传递给concat,因此我们的第一个条目将是(1 2)