我目前正在嘗試在OCaml中進行一些麻將手工處理,並從一開始就直接遇到了一些讓我感到困惑的東西。OCaml中有序的變體類型和子類型
我會給你基於卡片的例子,因爲我不想把任何人與麻將術語混淆。
就像這個part on User-Defined Types from OCaml for the Skeptical一樣,我想用不同的類型來描述西裝,卡片和所有東西。
type suit = Club | Diamond | Heart | Spade
type value = Jack | Queen | King | Ace | Num of int
type card = Card of suit * value | Joker
type hand = card list
那將是非常好的,如果我可以寫一個智能compare
功能會明白有序變量類型。
理想我會寫這樣的事情:
type suit = Club < Diamond < Heart < Spade
type value = Num of int < Jack < Queen < King < Ace
type card = Card of suit * value < Joker
type hand = card list
所以,當我做
List.sort Pervasives.compare [Card(Diamond, Num 3); Joker; Card(Spade, Ace); Card(Diamond, Num 2)]
它給了我
[Card(Diamond, Num 2); Card(Diamond, Num 3); Card(Spade, Ace); Joker]
唉,OCaml的頂層回報
[Joker; Card(Spade, Ace); Card(Diamond, Num 2); Card(Diamond, Num 3)]
(這已經是相當不錯!)
基本上我想要一個compare
功能,將採取暗示從類型聲明結構。
我讀過這article on polymorphic compare和this similar question但我不確定我想要取決於compare_val
。
我真的必須編寫自己的比較函數嗎?如果您建議我寫一篇文章,您是否對寫作方式有所建議,特別是爲了減少案件數量?
P.S:我剛纔聽到在Haskell約deriving(Ord)
...可能是足以讓我採取的飛躍......
我喜歡哈斯克爾,但我不會爲了獲取糖而跳上OCaml。特別是對於這種小型的。 – jozefg
如果Num可能受限於1..10 – aneccodeal
@aneccodeal,那麼總有一天我們會在主流語言中獲得依賴類型。 – paob