Порядок записи структурных сравнений F # - PullRequest
3 голосов
/ 20 сентября 2019

Если у меня есть запись, такая как:

type MyDate =
    { Year  : int
      Month : int
      Day   : int }

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

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

Например, с записью MyDate, приведенной выше: сравнивает ли каждое поле вв порядке их объявления я мог предположить следующее: { Year: 2010; Month: 9: Day: 8 } > { Year: 2009; Month: 10; Day: 20 }

Я изо всех сил пытался найти документацию, которая описывает, как работает структурное равенство для типов записей.Из тестов Fsharp.Core видно, как работает сравнение кортежей: https://github.com/fsharp/fsharp/blob/cb6cb5c410f537c81cf26825657ef3bb29a7e952/tests/fsharp/core/attributes/test.fsx#L737,, но я не могу найти аналогичный тест для типов записей.

1 Ответ

3 голосов
/ 20 сентября 2019

Ах, сразу после того, как я опубликовал вопрос, мне удалось найти ответ:

Из спецификации языка: https://fsharp.org/specs/language-spec/4.1/FSharpSpec-4.1-latest.pdf

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

...

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

Итак, в приведенном выше примере MyDate при сравнении двух экземпляров он будет:

  1. сравнить Year поля first
  2. , тогда, если годы совпадают, он будет сравнивать Month поля
  3. , тогда, если месяцы совпадают, он будет сравнивать Day поля
...