【问题标题】:Clojure: understaning the binding in a doseqClojure:了解doseq中的结合
【发布时间】:2014-04-13 08:16:33
【问题描述】:

我理解下面的sn-p代码及其对应的输出

(let  [ [x y] (map list [1 2] [3 4])]  (prn x) (prn y))
(1 3)
(2 4)
nil

现在下面的输出让我感到困惑:

(doseq [ [x y] (map list [1 2] [3 4])] (prn x y))
1 3
2 4
nil

我认为在上面的 sn-p x 将绑定到 [1 3] 而 y 将绑定到 [2 4] 所以输出应该是“

1 2
3 4
nil

【问题讨论】:

    标签: clojure


    【解决方案1】:

    绑定正在拉出嵌套中较大的单个元素内的单个元素。该映射创建了一个列表((1 3) (2 4),因此元素1 3 是第一个,因此这就是doseq 输出的内容:这是“解构”,xyboth 从在列表的 single 元素中。因此 x 和 y 是 1 和 3,然后是 2 和 4。

    另请注意,这与 for 中的绑定相同,解​​构适用于所有序列类型。

    【讨论】:

      【解决方案2】:

      让我们找出您困惑的根源。

      (map list [1 2] [3 4])
      

      计算为

      ((1 3) (2 4))
      

      所以你的第一个例子

      (let [[x y] (map list [1 2] [3 4])]  (prn x) (prn y))
      

      ... 等价于

      (let [[x y] [[1 3] [2 4]]] (prn x) (prn y))
      

      ...或者,打印略有不同

      (let [[x y] [[1 3] [2 4]]] (prn [x y]))
      

      ... 简化为

      (let [z [[1 3] [2 4]]] (prn z))
      

      ...按预期生产,

      ; [[1 3] [2 4]]
      ; nil
      

      到目前为止,一切都很好。

      如果我们把这个令人困惑的例子归结为,

      (doseq [ [x y] (map list [1 2] [3 4])] (prn x y))
      

      ...以同样的方式,我们得到,冒昧地打印每个z整体,

      (doseq [z [[1 3] [2 4]]] (prn z))
      

      相当清楚地产生观察到的顺序:

      [1 3]
      [2 4]
      nil
      

      不同之处在于doseqz 绑定到[[1 3] [2 4]] 中的每个连续向量,因此我们看不到封闭的[ ... ],而letz 绑定到整个事物一次.

      【讨论】:

        猜你喜欢
        • 2022-01-11
        • 2012-03-16
        • 1970-01-01
        • 2018-05-03
        • 2011-06-11
        • 1970-01-01
        • 2019-07-23
        • 2013-02-26
        • 1970-01-01
        相关资源
        最近更新 更多