Types 为什么我的类型总是比后面的类型更大?

Types 为什么我的类型总是比后面的类型更大?,types,ocaml,Types,Ocaml,我在ocaml中使用类型来做家庭作业,除了我的卡片值类型之外,所有的工作都正常,这总是导致整数卡片的得分高于人脸卡片,尽管它们是以名字命名的 我想你以后输入的任何类型名称都是按更大值的升序排列的?那么为什么int的Simple总是大于其他类型呢 我知道如果我把所有的值都放进去 type value = Two | Three... | King | Ace 它可以工作,但赋值要求数字卡使用Simple of int type value = Simple of int | Jack | Que

我在ocaml中使用类型来做家庭作业,除了我的卡片值类型之外,所有的工作都正常,这总是导致整数卡片的得分高于人脸卡片,尽管它们是以名字命名的

我想你以后输入的任何类型名称都是按更大值的升序排列的?那么为什么int的
Simple总是大于其他类型呢

我知道如果我把所有的值都放进去

type value = Two | Three... | King | Ace
它可以工作,但赋值要求数字卡使用
Simple of int

type value = Simple of int | Jack | Queen | King | Ace

Simple 9 > Jack //should be false but is true
Queen > Jack    //should be true and is true

任何
简单的int
都应该总是小于Jack小于Queen等。但是似乎每个
简单的int
总是大于甚至Ace。

简单构造函数有一个有效负载,而其他构造函数没有。Ocaml参考手册中提到了结构排序函数,如运算符(>)“这些函数与整数、字符、字符串、字节序列和浮点数的常规排序一致,并将其扩展为所有类型的总排序。排序与(=)兼容。”

因此,出于这些函数的目的,相同变量类型的构造函数具有总排序(因此,除其他事项外,对于相同的参数,运算符(=)和(>)的计算结果永远不会都为true),但不一定是您认为“通常”的排序


一种方法是编写一个函数,该函数的模式与变量匹配,并根据您自己想要的顺序返回一个数值,然后您可以使用运算符(>)进行比较。

通常最好定义您自己的比较函数,而不是依赖内置的多态比较(取决于值的内部内存表示形式)

 let (<) x y = match x, y with
 | Simple n, Simple m -> n < m
 | Simple _, _
 | Jack, ( Queen | King | Ace )
 | Queen, ( King | Ace )
 | King, Ace -> true
 | _ -> false
然后定义

 let num = function
 | Simple n -> 0, n
 | Jack -> 1, 0
 | Queen -> 1, 1
 | King -> 1, 2
 | Ace -> 1, 3
let (<) x y = num x < num y
   type t = A | B of int | C | D of int
type 'a list = 
| [] 
| (::) of 'a * 'a list