gpt4 book ai didi

Clojure 集合与序列的相等性

转载 作者:行者123 更新时间:2023-12-04 16:22:20 25 4
gpt4 key购买 nike

我注意到 Clojure (1.4) 似乎很乐意考虑等于 seq 的向量。相同的向量,但同样不适用于 map :

(= [1 2] (seq [1 2]))
=> true

(= {1 2} (seq {1 2}))
=> false

为什么要 =的行为这样不同吗?

最佳答案

Clojure 的 =可以认为是分两步进行比较:

  • 检查被比较的事物的类型是否属于同一个“平等分区”,这是一类其成员可能相等的类型(取决于给定数据结构的确切成员之类的东西,而不是特定类型分区);
  • 如果是这样,请检查被比较的事物是否实际上相等。

  • 一种这样的平等划分是“顺序”事物的划分。向量被认为是连续的:
    (instance? clojure.lang.Sequential [])
    ;= true

    与各种类型的序列一样:
    (instance? clojure.lang.Sequential (seq {1 2}))
    ;= true

    因此,当(且仅当)向量的对应元素相等时,向量被认为等于 seq。

    (请注意, (seq {}) 产生 nil ,它不是连续的,并且将“不等于”与 ()[] 等进行比较)

    另一方面,映射构成了它们自己的相等分区,因此虽然散列映射可能被认为与排序映射相等,但它永远不会被视为与 seq 相等。特别是它不等于其条目的seq,即 (seq some-map)产生。

    关于Clojure 集合与序列的相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10995655/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com