将区分的联合案例与F#中的<和>进行比较

Jus*_*ang 3 f# discriminated-union comparison-operators

我正在学习F#,我正在建立一套快速的功能,比较两个扑克手并确定胜利者.

我让这个有区别的联盟代表了扑克手的类别:

type Category =
    | HighCard
    | OnePair
    | TwoPair
    | ThreeOfAKind
    | Straight
    | Flush
    | FullHouse
    | FourOfAKind
    | StraightFlush
Run Code Online (Sandbox Code Playgroud)

我使用此代码来比较类别,以确定一只手是否优于另一只手:

if playerCategory > houseCategory then Win
elif playerCategory < houseCategory then Loss
// ... More code to handle cases within the same category
Run Code Online (Sandbox Code Playgroud)

所以,例如,表达式:

let playerCategory = FullHouse
let houseCategory = HighCard
if playerCategory > houseCategory then Win
elif playerCategory < houseCategory then Loss
// ... Other code
Run Code Online (Sandbox Code Playgroud)

会有价值Win.

但是,我不明白<和>运算符如何在这里工作.(最初我有一个函数将每个案例映射到一个数值,但我意识到这没有必要.)如果我重新排列案例的顺序然后逻辑中断,所以我假设每个案例都分配了一些默认值对应于其类型内的顺序?

但我肯定会更欣赏一点......

Lee*_*Lee 6

这在说明书中描述:

默认情况下,称为结构类型的记录,联合和结构类型定义隐式包含编译器生成的结构相等,散列和比较声明.这些隐式声明由结构相等和散列的以下内容组成

8.15.4生成的CompareTo实现的行为

如果T是联合类型,则首先在两个值的并集案例的索引上调用Microsoft.FSharp.Core.Operators.compare,然后在union案例所携带的数据的每个对应的x和y字段对上调用.返回第一个非零结果.