Obecnie próbuję wykonać przetwarzanie strony mahjong w OCaml i od samego początku napotykam na coś, co mnie trapi.Typy i podtypy uporządkowanych w OCaml
Podam wam przykłady oparte na kartach, ponieważ nie chcę nikogo mylić z terminologią mahjonga.
Podobnie jak w tym , chcę użyć typów wariantów do opisu kolorów, kart i wszystkiego.
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
I byłoby naprawdę miło, gdyby można napisać funkcję inteligentnej compare
że zrozumie uporządkowaną wariant typy.
Idealnie chciałbym napisać coś takiego:
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
Tak, że kiedy robię
List.sort Pervasives.compare [Card(Diamond, Num 3); Joker; Card(Spade, Ace); Card(Diamond, Num 2)]
daje mi
[Card(Diamond, Num 2); Card(Diamond, Num 3); Card(Spade, Ace); Joker]
niestety, powraca ocaml Toplevel
[Joker; Card(Spade, Ace); Card(Diamond, Num 2); Card(Diamond, Num 3)]
(która jest już dość dobre!)
Zasadniczo chcę compare
funkcję, która weźmie wskazówek ze struktury deklaracji typu.
Przeczytałem ten article on polymorphic compare i this similar question, ale nie jestem pewien, czy chcę polegać na compare_val
.
Czy muszę napisać własną funkcję porównywania? Jeśli polecisz mi napisać, czy masz wskazówki na temat sposobu, w jaki należy je napisać, szczególnie w celu zmniejszenia liczby przypadków?
P.S .: Właśnie słyszałem o deriving(Ord)
w Haskell ... może być za mało dla mnie do podjęcia skok ...
Uwielbiam Haskella, ale nie skakałbym statkiem po OCaml tylko po cukier "czerpiący". Specjalnie dla typu tego małego. – jozefg
również byłoby miło, gdyby Num mógł być ograniczony od 1..10 – aneccodeal
@ kod, tak, pewnego dnia otrzymamy typy zależne w głównym języku. – paob