想象一下,你有一個像額定如何在Haskell中爲代數數據類型實現「Ord」?
Rating = OneStar | TwoStars | ThreeStars | FourStars | FiveStars
什麼是實例化/實施「奧德」在哈斯克爾這樣的代數數據類型的最佳方式?
想象一下,你有一個像額定如何在Haskell中爲代數數據類型實現「Ord」?
Rating = OneStar | TwoStars | ThreeStars | FourStars | FiveStars
什麼是實例化/實施「奧德」在哈斯克爾這樣的代數數據類型的最佳方式?
最好的方法是將deriving (Eq, Ord)
添加到類型的定義中。
由於您按照升序列出了構造函數,因此派生的Ord
實例將爲您提供所需的順序。
但是,如果由於某些原因更改定義中的順序不是一個選項,則仍可以導出Eq,因爲對於該順序無關緊要。給定Eq的一個實例,我們可以手動爲Ord編寫一個實例。定義比較最簡潔的方法可能是拼出所有比較應該返回LT的組合,然後簡單地使用比較x y | x == y = Eq;比較其他組合的_ _ = GT。
如前所述,您可以派生出Eq
和Ord
。或者你可以得到Enum
,然後做
instance Eq Rating where
x == y = fromEnum x == fromEnum y
或者只是拼了這一切
instance Eq Rating where
OneStar == OneStar = True
TwoStar == TwoStar = True
...
_ == _ = False
謝謝,我不知道該命令被保留。 – LennyStackOverflow
獎勵問題:如果定義中的訂單不反映數字順序會怎麼樣? – LennyStackOverflow
@Lenny:然後你會實例化Ord並手動定義'compare'(假設由於某種原因改變了定義中的順序不是一個選項) - 你仍然可以得到Eq,但因爲這個順序並不重要。定義'compare'的最簡潔的方法可能是拼出所有比較應該返回LT的組合,然後簡單地使用'compare x y | x == y = Eq;比較_ _ = GT'爲其餘組合。 – sepp2k