Functional programming Erlang中集合的等价性检验

Functional programming Erlang中集合的等价性检验,functional-programming,erlang,set,Functional Programming,Erlang,Set,给定集合的数据结构,测试两个集合是否相等似乎是一项理想的任务,事实上许多实现都允许这样做(例如python中的内置集合) Erlang中有不同的集合实现:set、ordset、gb\u集合。他们的文档没有说明是否可以使用术语比较(“==”)来测试相等性,也没有提供测试相等性的显式函数 一些简单的情况似乎允许使用“==”进行相等测试,但我有一个更大的应用程序,我可以生成集合和gb_集合,它们相等(使用下面的函数进行测试),但不与“==”进行比较。对于或集,它们的比较总是相等的。不幸的是,我还没有找

给定集合的数据结构,测试两个集合是否相等似乎是一项理想的任务,事实上许多实现都允许这样做(例如python中的内置集合)

Erlang中有不同的集合实现:
set
ordset
gb\u集合
。他们的文档没有说明是否可以使用术语比较(“==”)来测试相等性,也没有提供测试相等性的显式函数

一些简单的情况似乎允许使用“==”进行相等测试,但我有一个更大的应用程序,我可以生成
集合
gb_集合
,它们相等(使用下面的函数进行测试),但不与“==”进行比较。对于
或集
,它们的比较总是相等的。不幸的是,我还没有找到一种方法来产生一个最小的例子,用于相等集不与“==”进行比较的情况

为了可靠地测试相等性,基于此,我使用以下函数:

我的问题是:

  • 为什么Erlang集实现不提供显式的平等性测试,这是一个基本原理吗
  • 对于不同的集合实现,如何解释使用“==”测试集合相等性时的差异
  • 如果“==”不比较相等,但在给定上述代码的情况下,这些集合是相等的,那么如何生成
    集合的最小示例
  • 关于问题2的一些想法:

    集合
    的文档声明“集合的表示未定义”。而
    ordset
    的文档声明“ordset是集合的表示”。
    gb\u集
    上的文档未给出任何可比指示。 来自的以下评论似乎重申了文件中的声明:

    注意,由于密钥的顺序未定义,我们可以在bucket中自由地重新排序密钥


    我的解释是,在Erlang中,与“==”的术语比较适用于集合的表示,即两个集合只有在其表示相同时才比较相等。这将解释不同集合实现的不同行为,但也强化了一个问题,即为什么没有明确的相等比较。

    ordset
    以排序列表的形式实现,并且实现是相当开放的,应该是可见的。它们将比较相等(
    =
    ),尽管
    =
    意味着1.0等于1。它们不会进行严格相等的比较(
    =:=

    集合
    以哈希表的形式实现,其内部表示不适合任何形式的直接比较;当散列冲突发生时,添加的最后一个元素将在给定散列项的列表前面。此前置操作对元素的添加顺序很敏感

    gb_集
    被实现为一个通用的平衡树,树的结构取决于插入元素的顺序和重新平衡发生的时间。直接比较它们是不安全的


    要将同一类型的两个集合进行比较,一个简单的方法是调用Mod:is_子集(A,B)和also Mod:is_子集(B,A)
    ——当两个集合相等时,它们只能是彼此的子集。

    我认为没有显式相等测试的特殊原因。如果您提交一个在所有三个集合实现中实现此函数的请求,则可能会被接受。最后一句中有一个错误:不是“两个集合相等时可以是彼此的子集”,而是“两个集合相等时不能是彼此的子集”不,是“可以”<代码>集合:is_subset(A,A)始终为真,因为每个集合都是其自身的子集。你当然是对的。不过谢谢你的编辑,我认为新的公式更清晰!
    %% @doc Compare two sets for equality.
    -spec sets_equal(sets:set(), sets:set()) -> boolean().
    sets_equal(Set1, Set2) ->
        sets:is_subset(Set1, Set2) andalso sets:is_subset(Set2, Set1).