【问题标题】:Can someone explain me the following example?有人可以解释一下下面的例子吗?
【发布时间】:2015-01-31 09:43:10
【问题描述】:

好吧,我是 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))

我试图理解,但我很困惑 key 和 values 是如何工作的,我不确定当函数 for 和 concat 使用 k、k2、v 和 v2 时它们的确切值是什么。

感谢您的帮助。

【问题讨论】:

    标签: algorithm clojure functional-programming lisp


    【解决方案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 混合在同一个地方会让人更难看出所发生的一切都是嵌套序列理解。

    【讨论】:

      【解决方案2】:

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

      for循环遍历v中的元组,再次解构,因此在第一种情况下,k2将是:x,v2将是(1 2)。

      这被传递给 concat,所以我们的第一个条目将是 (:a :x 1 2)

      【讨论】:

        猜你喜欢
        • 2016-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-22
        • 2016-12-12
        • 2018-07-28
        • 2019-06-07
        相关资源
        最近更新 更多