Ich versuche gerade, einige Hands in Mahjong in OCaml zu bearbeiten und bin von Anfang an mit etwas konfrontiert, was mich nervt.Geordnete Variantentypen und Subtypen in OCaml
Ich gebe Ihnen Beispiele basierend auf Karten, weil ich niemanden mit Mahjong-Terminologie verwechseln will.
Genau wie in diesem part on User-Defined Types from OCaml for the Skeptical, möchte ich Variantentypen verwenden, um Anzüge, Karten und alles zu beschreiben.
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
Und es wäre wirklich schön, wenn ich eine intelligente compare
Funktion schreiben könnte, die Variantentypen bestellt verstehen würde.
Im Idealfall würde ich so etwas schreiben:
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
So dass, wenn ich
List.sort Pervasives.compare [Card(Diamond, Num 3); Joker; Card(Spade, Ace); Card(Diamond, Num 2)]
es gibt mir
[Card(Diamond, Num 2); Card(Diamond, Num 3); Card(Spade, Ace); Joker]
Ach, die ocaml Toplevel kehrt
[Joker; Card(Spade, Ace); Card(Diamond, Num 2); Card(Diamond, Num 3)]
(die bereits ziemlich gut ist!)
Grundsätzlich möchte ich eine compare
Funktion, die Hinweise aus der Typdeklaration Struktur nehmen würde.
Ich habe diese article on polymorphic compare und this similar question gelesen, aber ich bin mir nicht sicher, ob ich mich auf compare_val
verlassen möchte.
Muss ich wirklich meine eigene Vergleichsfunktion schreiben? Wenn Sie mir empfehlen, eines zu schreiben, haben Sie Tipps, wie es geschrieben werden sollte, insbesondere um die Anzahl der Fälle zu reduzieren?
P. S .: Ich habe gerade gehört, über deriving(Ord)
in Haskell ... Könnte genug für mich, den Sprung zu nehmen ...
Ich liebe Haskell, aber ich würde nicht auf OCaml springen, nur um 'Zucker 'abzuleiten. Vor allem für einen Typ so klein. – jozefg
auch wäre es nett, wenn Num von 1..10 – aneccodeal
@aneccodeal yep eingeschränkt werden könnte, irgendwann werden wir abhängige Typen in einer Mainstream-Sprache bekommen. – paob