2013-02-27 64 views
0

是否有一个特定的原因,为什么重写平等和比较运算符生成除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

比较和相等运算符(<>=)具有良好定义的行为(spec §8.15.6)。具体而言,比较取决于IComparable的实现,并且相等取决于Equals

在C#中,只有和C#中同名操作符相似的地方。您仍然可以提供C#变种,完全与非传统行为,从其他.NET语言

type T() = 
    static member op_LessThan (a: T, b: T) = new obj() 

使用,但它们对F#的平等和比较操作没有任何影响。

+0

F#中所有类型的比较和相等不是结构化的 - 只有元组和“列表,选项,数组和用户定义的记录,联合和结构类型的成员字段类型允许结构等同性,哈希和比较”。所以对于一个用户定义的类,它*应该可以重载这些运算符。 – 2013-02-28 00:19:57

+0

的确如此。我的观点是,平等/比较在F#中有不同且明确的行为。它们不像C#中那样具有特殊的含义。他们可以在F#中进行自定义,但不在OP需要的范围内。 – Daniel 2013-02-28 01:36:23

+0

使用上述方法是否有风险? – Dave 2013-02-28 04:08:56