Tôi hiện đang cố gắng thực hiện một số chế biến tay mahjong trong OCaml và ngay từ đầu tôi đang phải đối mặt với một cái gì đó gây lỗi cho tôi.Các loại biến thể và kiểu phụ được đặt hàng trong OCaml
Tôi sẽ cung cấp cho bạn các ví dụ dựa trên thẻ vì tôi không muốn gây nhầm lẫn cho bất kỳ ai có thuật ngữ mạt chược.
Giống như trong số này part on User-Defined Types from OCaml for the Skeptical, tôi muốn sử dụng các loại biến thể để mô tả bộ quần áo, thẻ và mọi thứ.
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
Và sẽ rất tuyệt nếu tôi có thể viết chức năng thông minh compare
có thể hiểu các loại biến thể được đặt hàng.
Lý tưởng nhất là tôi muốn viết một cái gì đó như thế:
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
Vì vậy mà khi tôi làm
List.sort Pervasives.compare [Card(Diamond, Num 3); Joker; Card(Spade, Ace); Card(Diamond, Num 2)]
nó mang lại cho tôi
[Card(Diamond, Num 2); Card(Diamond, Num 3); Card(Spade, Ace); Joker]
Than ôi, lợi nhuận ocaml mục cấp đầu
[Joker; Card(Spade, Ace); Card(Diamond, Num 2); Card(Diamond, Num 3)]
(đó là đã khá tốt!)
Về cơ bản tôi muốn có một chức năng compare
rằng sẽ mất gợi ý từ cấu trúc khai báo kiểu.
Tôi đã đọc số này article on polymorphic compare và this similar question nhưng tôi không chắc chắn mình có muốn phụ thuộc vào compare_val
hay không.
Tôi có thực sự phải viết chức năng so sánh của riêng mình không? Nếu bạn đề nghị tôi viết một, bạn có lời khuyên về cách nó nên được viết, đặc biệt là để giảm số lượng các trường hợp?
P.S .: Tôi chỉ nghe nói về deriving(Ord)
trong Haskell ... Có thể là đủ cho tôi để có những bước nhảy vọt ...
Tôi yêu Haskell, nhưng tôi sẽ không chuyển tàu trên OCaml chỉ cho đường 'deriving'. Đặc biệt đối với loại nhỏ này. – jozefg
cũng sẽ tốt nếu Num có thể bị hạn chế từ 1..10 – aneccodeal
@aneccodeal yep, một ngày nào đó chúng ta sẽ nhận được các loại phụ thuộc theo ngôn ngữ chính thống. – paob