是否有一个特定的原因,为什么覆盖相等和比较运算符以生成除bool之外的类型是如此困难。
下面我有一个解决方法,但为什么语言不能让这更容易呢?
我在这里工作的是一个外部库,已经重载了这些运算符,我只是希望它们在F#中以相同的方式工作。为了实现这一点,我必须这样做才是正确的。
type ATArrayLT = ATArrayLT with
static member (?<-) (x:ATArray, ATArrayLT, y:int ) = ATArray.op_LessThan(x, float32 y)
static member (?<-) (y:int , ATArrayLT, x:ATArray) = ATArray.op_LessThan(x, float32 y)
static member (?<-) (x:ATArray, ATArrayLT, y:float32) = ATArray.op_LessThan(x, y)
static member (?<-) (y:float32, ATArrayLT, x:ATArray) = ATArray.op_LessThan(x, y)
static member (?<-) (x:ATArray, ATArrayLT, y:ATArray) = ATArray.op_LessThan(x, y)
static member inline (?<-) (x , ATArrayLT, y ) = x < y
let inline (<) x y = x ? (ATArrayLT) <- y
答案 0 :(得分:1)
比较和相等运算符(<
,>
,=
)具有明确定义的行为(spec §8.15.6)。具体而言,比较取决于IComparable
实施,而平等取决于Equals
。
C#中同名的运营商只有相似之处。您仍然可以提供C#变体,以及非传统行为,以便从其他.NET语言中使用
type T() =
static member op_LessThan (a: T, b: T) = new obj()
但它们对F#的相等和比较运算符没有影响。