2013-02-27 29 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