6

如果我有这样的记录:

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

我知道 F# 的结构比较将确保在对列表进行排序时,它将保持一致的顺序。

我的问题是我是否可以依靠它以特定的方式进行比较,那是什么?

例如MyDate上面的记录:如果它按照声明的顺序比较每个字段,那么我可以假设以下内容: { Year: 2010; Month: 9: Day: 8 } > { Year: 2009; Month: 10; Day: 20 }

我一直在努力寻找描述 Record 类型的结构相等性如何工作的文档。我可以从 Fsharp.Core 测试中看到元组比较是如何工作的:https ://github.com/fsharp/fsharp/blob/cb6cb5c410f537c81cf26825657ef3bb29a7e952/tests/fsharp/core/attributes/test.fsx#L737 ,但我似乎看不到为记录类型找到类似的测试。

4

1 回答 1

4

啊,在我发布问题后,我设法找到了答案:

来自语言规范:https ://fsharp.org/specs/language-spec/4.1/FSharpSpec-4.1-latest.pdf

8.15.4 生成的 CompareTo 实现的行为

...

• 如果T 是结构或记录类型,则按声明顺序对x 和y 的每对相应字段对调用FSharp.Core.Operators.compare,并返回第一个非零结果。

所以在上面的MyDate例子中,当比较两个实例时,它将:

  1. 先比较Year字段
  2. 那么如果年份相同,它将比较Month字段
  3. 那么如果月份相同,它将比较Day字段
于 2019-09-20T12:12:19.307 回答