我正在尝试在OCaml中实现纸牌游戏。
type rank = Three | Four | Five | Six;;
(我简化了)我的问题是:是否可以从一个等级(例如四个)访问以下/上一个? (五/三)
我测试了一些东西,看到我们可以与compare > < =
不同的级别进行比较。因此,知道订单存在,也许增量过程可能是一个等级?
(如果没有解决方案,我可以做一个与大匹配的功能,并告诉每个等级返回什么,但如果存在最快的解决方案...)
您可以使用ppx_deriving定义枚举类型,以便轻松访问基础整数值。
更新
我从来没有使用ppx_deriving,所以我想我会尝试一下。这是一个适合我的小代码:
type cards = Five [@value 5] | Six | Seven [@@deriving enum]
let apply_enum fn card =
match cards_of_enum (fn (cards_to_enum card)) with
| None -> failwith "apply_enum: no such value"
| Some p -> p
let predecessor card = apply_enum (fun x -> x - 1) card
let successor card = apply_enum ((+) 1) card
所以我们有点被迫使用整数,而我的类型没有那么多的可能性,所以我决定做一个函数rankToInt,每个等级关联一个int。我真的不需要更多我必须做的事情,但我知道更好的解决方案是定义一个类型等级,其中包含一个整数值,我们不必每次都调用像rankToInt这样的函数。