あなたがHaskellで代数データ型の "Ord"を実装する方法は?
Rating = OneStar | TwoStars | ThreeStars | FourStars | FiveStars
のような評価を持っている想像してインスタンス化するための最良の方法は何/ Haskellでは、このような代数的データ型の「オード」を実装しますか?
あなたがHaskellで代数データ型の "Ord"を実装する方法は?
Rating = OneStar | TwoStars | ThreeStars | FourStars | FiveStars
のような評価を持っている想像してインスタンス化するための最良の方法は何/ Haskellでは、このような代数的データ型の「オード」を実装しますか?
最も良い方法は、タイプ定義にderiving (Eq, Ord)
を追加することです。
コンストラクタを昇順に並べたので、派生したOrd
インスタンスは、必要な順序を正確に示します。
しかし、何らかの理由で定義内の順序を変更することはオプションではない場合でも、順序は関係ありませんので、Eqを引き出すことができます。 Eqのインスタンスが与えられれば、Ordのインスタンスを手作業で書くことができます。 compareを定義する最も簡潔な方法は、おそらくcompareがLTを返すべきすべての組み合わせを綴ることであり、単にcompare 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
@レニー:次に、Ordをインスタンス化し、手で 'compare'を定義します(何らかの理由で定義の順序を変更することはオプションではないと仮定します)。Eqを引き出すことはできますが、順序は関係ありません。 'compare'を定義する最も簡潔な方法は、compareがLTを返すべきすべての組み合わせを綴ることです。そして、単にcompare x y | x == y = Eq;残りの組み合わせについては_ _ = GT'を比較してください。 – sepp2k