2011-08-16 65 views

回答

14

最好的方法是將deriving (Eq, Ord)添加到類型的定義中。

由於您按照升序列出了構造函數,因此派生的Ord實例將爲您提供所需的順序。

但是,如果由於某些原因更改定義中的順序不是一個選項,則仍可以導出Eq,因爲對於該順序無關緊要。給定Eq的一個實例,我們可以手動爲Ord編寫一個實例。定義比較最簡潔的方法可能是拼出所有比較應該返回LT的組合,然後簡單地使用比較x y | x == y = Eq;比較其他組合的_ _ = GT。

+0

謝謝,我不知道該命令被保留。 – LennyStackOverflow

+0

獎勵問題:如果定義中的訂單不反映數字順序會怎麼樣? – LennyStackOverflow

+2

@Lenny:然後你會實例化Ord並手動定義'compare'(假設由於某種原因改變了定義中的順序不是一個選項) - 你仍然可以得到Eq,但因爲這個順序並不重要。定義'compare'的最簡潔的方法可能是拼出所有比較應該返回LT的組合,然後簡單地使用'compare x y | x == y = Eq;比較_ _ = GT'爲其餘組合。 – sepp2k

3

如前所述,您可以派生出EqOrd。或者你可以得到Enum,然後做

instance Eq Rating where 
    x == y = fromEnum x == fromEnum y 

或者只是拼了這一切

instance Eq Rating where 
    OneStar == OneStar = True 
    TwoStar == TwoStar = True 
... 
    _ == _ = False