Сравнение случаев размеченных союзов с ‹ и › в F#

Я изучаю F# и создаю быстрый набор функций, которые сравнивают две покерные комбинации и определяют победителя.

Я создал этот размеченный союз для представления категорий покерных комбинаций:

type Category =
    | HighCard
    | OnePair
    | TwoPair
    | ThreeOfAKind
    | Straight
    | Flush
    | FullHouse
    | FourOfAKind
    | StraightFlush

Я использую этот код для сравнения категорий, чтобы определить, лучше ли одна рука, чем другая:

if playerCategory > houseCategory then Win
elif playerCategory < houseCategory then Loss
// ... More code to handle cases within the same category

Так, например, выражение:

let playerCategory = FullHouse
let houseCategory = HighCard
if playerCategory > houseCategory then Win
elif playerCategory < houseCategory then Loss
// ... Other code

Будет иметь значение Win.

Однако я не понимаю, как здесь могут работать операторы ‹ и >. (Первоначально у меня была функция, которая сопоставляла каждый случай с числовым значением, но я понял, что в этом нет необходимости.) Если я изменю порядок случаев, то логика сломается, поэтому я предполагаю, что каждому случаю присваивается какое-то значение по умолчанию. соответствует его порядку внутри типа?

Но я определенно был бы признателен за более глубокое понимание...


person Justin Lang    schedule 14.08.2014    source источник


Ответы (2)


Это описано в спецификации:

по умолчанию определения типов записи, объединения и структуры, называемые структурными типами, неявно включают сгенерированные компилятором объявления для структурного равенства, хеширования и сравнения. Эти неявные объявления состоят из следующего для структурного равенства и хеширования.

8.15.4 Поведение сгенерированных реализаций CompareTo

Если T является типом объединения, вызовите Microsoft.FSharp.Core.Operators.compare сначала для индекса случаев объединения для двух значений, а затем для каждой соответствующей пары полей x и y для данных, переносимых случаем объединения. Возвращает первый ненулевой результат.

person Lee    schedule 14.08.2014
comment
Итак, когда он говорит об индексе случаев объединения для двух значений, индекс относится к позиции случая в типе объединения? - person Justin Lang; 15.08.2014

В дополнение к тому, что сказал Ли, в спецификации также есть

8.5.4 Скомпилированная форма типов соединений для использования из других языков CLI

Скомпилированный тип объединения U имеет:

...

Одно свойство экземпляра CLI U.Tag для каждого случая C. Это свойство извлекает или вычисляет целочисленный тег, соответствующий случаю.

Сгенерированный компилятором метод CompareTo использует резервные поля этих свойств для определения индекса, как указано в 8.15.4. Об этом свидетельствует IlSpy:

int tag = this._tag;
int tag2 = category._tag;
if (tag != tag2)
{
    return tag - tag2;
}
if (this.Tag != 0)
{
    return 0;
}
person kaefer    schedule 14.08.2014