2011-08-16 29 views

答えて

14

最も良い方法は、タイプ定義にderiving (Eq, Ord)を追加することです。

コンストラクタを昇順に並べたので、派生したOrdインスタンスは、必要な順序を正確に示します。

しかし、何らかの理由で定義内の順序を変更することはオプションではない場合でも、順序は関係ありませんので、Eqを引き出すことができます。 Eqのインスタンスが与えられれば、Ordのインスタンスを手作業で書くことができます。 compareを定義する最も簡潔な方法は、おそらくcompareがLTを返すべきすべての組み合わせを綴ることであり、単にcompare x y | x == y = Eq;残りの組み合わせについて_ _ = GTを比較してください。

+0

をそれをすべて綴るを行うことができおかげで、私は順序が保存されていることを知りませんでした。 – LennyStackOverflow

+0

ボーナスの質問:確定の順序が数字の順序を反映しない場合はどうなりますか? – LennyStackOverflow

+2

@レニー:次に、Ordをインスタンス化し、手で 'compare'を定義します(何らかの理由で定義の順序を変更することはオプションではないと仮定します)。Eqを引き出すことはできますが、順序は関係ありません。 'compare'を定義する最も簡潔な方法は、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 
関連する問題