В настоящее время я пытаюсь выполнить обработку маджонга в 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 .: Я только слышал о deriving(Ord)
в Haskell ... Может быть достаточно для меня, чтобы совершить прыжок ...
Я люблю Haskell, но я бы не прыгнул с корабля на OCaml просто для 'получения 'сахара. Специально для типа это мало. – jozefg
также было бы неплохо, если бы Num можно было ограничить от 1..10 – aneccodeal
@aneccodeal yep, когда-нибудь мы получим зависимые типы в основном языке. – paob