2015-04-05 98 views
3

是否有可能模式匹配對像一個列表的集合?例如,考慮下面的代碼:模式匹配對集合

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是否爲空,或者它是否只包含一個元素,然後繼續使用該元素,或者它包含兩個元素等等。

我的第一個實現比較了集合的基數,然後我選擇了一個元素或兩個元素等等,但是這樣做有點麻煩,我希望模式匹配會產生更多可讀/可維護的代碼。

回答

2

不是。Set的實現是隱藏的,因此您不能直接模式匹配該值。您必須使用Set模塊中定義的函數來解構它。檢查set.mli。沒有你的問題的很多細節,我們不能說你應該使用哪個功能。可能爲choosesplititerfold,或簡單地elements

設置要求對元素值進行排序,並將其實現爲二進制樹,其中元素按該順序排序。因此,Set的這些功能應該始終與equal集相同。

+0

感謝您的解釋!我曾希望模式匹配能以某種方式起作用,但你是完全正確的,因爲實現是隱藏的,所以我們不能解構一個集合。 – 2015-04-07 08:27:04