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
F#中所有类型的比较和相等不是结构化的 - 只有元组和“列表,选项,数组和用户定义的记录,联合和结构类型的成员字段类型允许结构等同性,哈希和比较”。所以对于一个用户定义的类,它*应该可以重载这些运算符。 – 2013-02-28 00:19:57
的确如此。我的观点是,平等/比较在F#中有不同且明确的行为。它们不像C#中那样具有特殊的含义。他们可以在F#中进行自定义,但不在OP需要的范围内。 – Daniel 2013-02-28 01:36:23
使用上述方法是否有风险? – Dave 2013-02-28 04:08:56