繁体   English   中英

f#中有区别的联合的内置比较

[英]Built-in compare on discriminated unions in f#

在回答这个问题时 ,我发现了以下对歧视联盟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,然后在union案例所携带的数据的每个对应的x和y字段对上调用。 返回第一个非零结果。

从那时起,我希望类型T上的compare总是给出-1,0,1中的一个,因为这是数字类型的compare行为。 (对?)

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

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)将值转换为整数来获得距离。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM