If I have an record such as:
type MyDate =
{ Year : int
Month : int
Day : int }
I know that F#'s structural comparison will ensure that when a list is sorted it will maintain a consistent order.
My question is whether I can rely on it to do the comparison in a specific way, and what that way is?
For example with the MyDate
record above: if it compares each field in the order they were declared then I could assume the following:
{ Year: 2010; Month: 9: Day: 8 } > { Year: 2009; Month: 10; Day: 20 }
I've struggled to find the documentation that describes how the structure equality for Record types work. I can see from the Fsharp.Core tests how tuple comparison works: https://github.com/fsharp/fsharp/blob/cb6cb5c410f537c81cf26825657ef3bb29a7e952/tests/fsharp/core/attributes/test.fsx#L737, but I can't seem to find a similar test for Record types.
Ah, straight after I posted the question I managed to find the answer:
From the language spec: https://fsharp.org/specs/language-spec/4.1/FSharpSpec-4.1-latest.pdf
8.15.4 Behavior of the Generated CompareTo Implementations
...
• If T is a struct or record type, invoke FSharp.Core.Operators.compare on each corresponding pair of fields of x and y in declaration order, and return the first non-zero result.
So in the above MyDate
example, when comparing two instances it will:
Year
fields firstMonth
fieldsDay
fieldsIf you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With