Types &引用;“增量”;创建的类型

Types &引用;“增量”;创建的类型,types,ocaml,increment,Types,Ocaml,Increment,我正在尝试用OCaml实现一个纸牌游戏 type rank = Three | Four | Five | Six;; (我简化了)我的问题是: 是否可以从一个列组(例如四个)访问下一个/上一个列组?(五/三) 我测试了一些东西,发现我们可以比较不同的等级。所以知道了顺序的存在,也许一个等级的递增过程是可能的 (如果没有解决方案,我可以使用一个大匹配的函数,并告诉每个列组返回什么,但如果存在最快的解决方案…您可以使用它定义枚举类型,以便轻松访问基础整数值 更新 我从未使用过ppx_派生,所以我

我正在尝试用OCaml实现一个纸牌游戏

type rank = Three | Four | Five | Six;;
(我简化了)我的问题是: 是否可以从一个列组(例如四个)访问下一个/上一个列组?(五/三)

我测试了一些东西,发现我们可以比较不同的等级。所以知道了顺序的存在,也许一个等级的递增过程是可能的

(如果没有解决方案,我可以使用一个大匹配的函数,并告诉每个列组返回什么,但如果存在最快的解决方案…

您可以使用它定义枚举类型,以便轻松访问基础整数值

更新

我从未使用过ppx_派生,所以我想我应该试试。这里有一个适合我的小代码:

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这样的函数。

如果需要做数学运算,那么最好创建一个包含整数的类型。或者编写一个函数,将整数转换为您的类型或从您的类型转换为整数。好吧,这样就没有简单的方法了?我给了您一个简单的方法:编写一个函数,将整数转换为整数。“琐碎”的意思是“我知道怎么做”。现在,如果你想写一个增量,那么你必须说明
Six
的增量是多少。是的,对不起,哈哈,我写了我的评论,承认你的第一个解决方案是“最佳”的,我实际上决定写一个函数,正如我在这个主题的回答中所描述的那样。谢谢你的回答!请注意,OCaml文档描述了当您决定从C代码访问类型时的类型表示。因此,对于您的问题,一个丑陋的答案是编写一个C函数,该函数获取一个秩并返回一个秩。根据当前对类型表示的描述,此函数可以编写为一个C附加函数,并进行额外的安全测试。一个更丑陋的捷径是使用模块
Obj
,但它没有文档化,所以我会坚持根据文档化的接口编写C代码。(不,实际上也不行)我在没有外部资源的情况下工作,但这对我的个人来说真的很有趣。我知道,最终对于未来的项目来说,这要感谢他们没有为前任/继任者功能内置的机制。事实上,我经常希望得到它们。非空构造函数使它变得复杂。例如,什么是
None
的继承者,还是
Some true
的前身?是的,我问过自己这个问题,但当我看到比较器在idk工作时,我认为它可能存在,但是的,显然会有问题,因此,没有内置机制是合乎逻辑的。不过,谢谢你的帮助和解释!