给定一个用于集合的数据结构,测试两个集合是否相等似乎是一项理想的任务,事实上许多实现都允许这样做(例如 Python 中的内置集合)。
Erlang 中有不同的集合实现:
一些简单的情况似乎允许使用“==”进行相等性测试,但我有一个更大的应用程序,在其中我能够生成相等的
为了可靠地测试相等性,我使用以下基于此关于集合相等的定理的函数:
Erlang 中有不同的集合实现:
sets
、ordsets
、gb_sets
。它们的文档没有说明是否可以使用术语比较(“==”)来测试相等性,也没有提供显式函数来测试相等性。一些简单的情况似乎允许使用“==”进行相等性测试,但我有一个更大的应用程序,在其中我能够生成相等的
sets
和 gb_sets
(使用下面的函数测试),但它们在使用“==”比较时并不相等。对于 ordsets
,它们总是相等的。不幸的是,我还没有找到一种方法来为相等的集合与“==”不相等的情况提供一个最小的示例。为了可靠地测试相等性,我使用以下基于此关于集合相等的定理的函数:
%% @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).
我的问题:
- 为什么Erlang集合实现没有提供明确的相等测试?
- 如何解释使用“==”测试不同集合实现的集合相等性之间的差异?
- 如何生成一个关于集合
sets
的最小示例,其中“==”不会比较相等,但根据上述代码,这些集合是相等的?
对第2个问题的一些想法:
sets
的文档说明,“集合的表示未定义”,而ordsets
的文档则表示“ordset是集合的一种表示方法”。gb_sets
的文档没有给出任何可比较的指示。
以下评论来自sets
实现的源代码,似乎重申了文档中的说法:
请注意,由于键的顺序未定义,因此我们可以在桶内自由地重新排序键。
我的理解是,在Erlang中,“==”的术语比较作用于集合的表示形式,即仅当两个集合的表示完全相同时,它们才会进行相等比较。这可以解释不同集合实现的不同行为,但也加强了问题,为什么没有明确的相等比较。