针对集合的模式匹配

Pattern match against a Set

是否可以像对列表那样对集合进行模式匹配?例如考虑以下代码:

module MySet = Set.Make (struct ... end)
match MySet.empty with
| MySet () -> "Empty Set"
| MySet (x) -> "Set with exactly one element"
| MySet (x, y, _) -> "Set with at least two elements"

当然,集合是一种无序数据类型,所以我不能指望在每个 运行 中获得对 xy 的相同绑定(尽管有人可能会实现这个通过比较功能的功能,但我们对这个问题保持简单。

我为什么要问这个问题?有时我想检查一个 Set 是否为空,或者它是否只包含一个元素然后继续这个元素,或者它是否包含两个元素等等。

我的第一个实现比较了集合的基数,然后我继续选择一个或两个元素等等,但这在某种程度上很麻烦,我希望模式匹配会产生更多的 readable/maintainable 代码。

没有。 Set 的实现是隐藏的,因此您不能直接对值进行模式匹配。您必须使用 Set 模块中定义的函数来解构它。检查 set.mli。如果您的问题没有太多细节,我们无法确定您应该使用哪个功能。可能是 choosesplit,或者 iterfold,或者只是 elements

Set 需要对元素值进行排序,它被实现为二叉树,其中元素按该顺序排序。因此,Set 的这些功能对于 equal 个集合应该始终相同。