有人可以解释我下面的例子吗?

时间:2014-12-03 00:07:30

标签: algorithm clojure functional-programming lisp

我是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的确切值是什么。

感谢您的帮助。

2 个答案:

答案 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))

mapcatfor混合在同一个地方会让人更难发现所发生的一切都是嵌套的序列理解。

答案 1 :(得分:0)

该函数应用于传入映射的每个键值元组。 [[k v]]会对元组进行解构,因此在第一种情况下,k的值为:av的值为{:x (1 2) :y (3 4)}

for循环遍历v中的元组,再次进行解构,因此在第一种情况下,k2将为:xv2将为{{1} }}

这将传递给concat,因此我们的第一个条目将是(1 2)