【问题标题】:Why do vectors implement Associative?为什么向量实现关联?
【发布时间】:2017-12-04 17:02:46
【问题描述】:

我惊讶地发现clojure 向量实现了关联接口。

(associative? [1 2 3]) ; => true

我假设这个接口提供了优化的键索引。按照这个假设,该接口似乎适用于地图数据结构,但对于向量来说很奇怪,在我看来,它不遵循键值启发式。

我对@9​​87654323@ 或vector 的实现是否不正确?这种设计选择的目的是什么?

【问题讨论】:

    标签: vector clojure


    【解决方案1】:

    最初可能看起来并不直观,但向量由它们的索引键控,这允许它们使用所有标准的关联函数。这使得对它们进行简单的操作变得非常容易:

    (def v [1 2 3])
    
    (assoc v 1 4)
    [1 4 3]
    
    (update v 1 inc)
    [1 3 3]
    
    (get v 1) ; The same as (v 1)
    2 
    

    或者,如果你有一个二维向量:

    (def v [[1 2 3]
            [4 5 6]
            [7 8 9]])
    
    (assoc-in v [2 1] 0)
    [[1 2 3]
     [4 5 6]
     [7 0 9]]
    

    如果没有这种设计选择,则需要创建一整套单独的函数并专门用于向量。有了标准化的接口,您就可以编写不关心具体正在处理什么结构的函数。

    这样想:假设您想编写一个“替换”向量元素的函数。它的签名与现有的assoc 函数有什么不同吗?除了特别期待一个向量?

    【讨论】:

      【解决方案2】:

      Clojure 向量将 index 与一个值相关联。这意味着您可以执行以下操作:

      (assoc [0 1] 0 2)
      
      (reduce-kv (fn [m idx v]
                   (assoc m idx v)) {} [0 1 2])
      

      两者都很有效。

      【讨论】:

        猜你喜欢
        • 2021-12-31
        • 1970-01-01
        • 1970-01-01
        • 2019-05-15
        • 2013-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-07
        相关资源
        最近更新 更多