4

在回答这个问题compare时,我发现了受歧视工会的以下行为。

type T = A | B | C | D 
compare A B   (* val it : int = -1 *)
compare A C   (* val it : int = -2 *)
compare A D   (* val it : int = -3 *)

我对此感到惊讶。

我可以依靠compare测量这样的构造函数之间的“距离”吗?

规范(第 154 页)关于生成的compareTo

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

从那以后,我希望comparetypeT总是给出一个,-1,0,1因为这就是compare数字类型的行为方式。(正确的?)

4

1 回答 1

3

规范中的引用说生成的比较将首先比较标签(本质上是构造函数的索引),但我不确定这是否会给你任何有用的信息——因为如果联合带有一些价值,你会不知道这个数字是构造函数之间的距离,还是包含值比较的结果。例如:

type Tricky() = 
  interface System.IComparable with
    override x.CompareTo(b) = -2

type DU = 
 | A of Tricky
 | B 
 | C

// Returns -2 because of the distance between constructors
compare (A (Tricky())) C
// Returns -2 because of the comparison on `Tricky` objects
compare (A (Tricky())) (A(Tricky()))

如果您想依靠获取构造函数之间距离的能力,使用枚举可能更安全:

type DU = 
 | A = 1
 | B = 2 
 | C = 3

然后,您可以通过使用将值转换为整数来获得距离(int DU.A) - (int DU.C)

于 2014-03-15T19:17:52.593 回答