[英]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.