模式匹配集

时间:2015-04-05 09:42:25

标签: ocaml

是否可以针对List进行模式匹配?例如,请考虑以下代码:

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"

当然,set是一种无序数据类型,所以我不能期望在每次运行中获得与xy相同的绑定(尽管可以通过compare函数实现此功能,但我们对这个问题保持简单。)

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

我的第一个实现比较了集合的基数,然后我继续选择一个元素或两个元素等等,但这有点麻烦,我希望模式匹配会产生更易读/​​可维护的代码。

1 个答案:

答案 0 :(得分:2)

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

Set需要对元素值进行排序,并将其实现为二叉树,其中元素按此顺序排序。因此,对于equal集,Set的这些函数应该始终相同。