12

カスタムデータ型を ord 可能にする方法を誰かに説明してもらえますか?

** スーツ自体に変更を加えることは許可されていません。導出 (Eq、Ord)

data Suit = Clubs | Diamonds | Hearts | Spades deriving (Eq)

私の試み:

instance Ord Suit where
    compare suit1 suit2 = compare suit1 suit2

しかし、それは継続的なループにあるようで、停止しません。

4

3 に答える 3

12

Ord の定義は次のようになります (完全ではありません)。

class Ord a where
    compare :: a -> a -> Ordering

Ordering3 つの可能な値がありますLT, EQ, GT

したがって、各比較の結果がどうあるべきかを定義する必要があります。何かのようなもの:

instance Ord Suit where
    compare Clubs Diamonds    = LT
    compare Diamonds Clubs    = GT
    compare Diamonds Diamonds = EQ
    compare Diamonds _        = LT -- Diamonds are lower than everything besides Clubs and Diamonds

実際の注文は異なる場合がありますが、基本的な考え方は理解できるはずです。

于 2013-03-21T04:39:52.403 に答える
6

Ord各比較の結果を詳しく説明する必要がないカスタムインスタンスを作成する方法は次のとおりです。

instance Ord Suit where
    compare a b = compare (relativeRank a) (relativeRank b) where
         relativeRank Diamonds = 1
         relativeRank Clubs = 2
         relativeRank Hearts = 3
         relativeRank Spades = 4

ここでは、各コンストラクターについて1回だけ言及する必要があり、異なる順序を簡単に決定できます。

を使用することもできますcompare Data.Function.on relativeRankが、これはおそらく理解しやすいでしょう。

于 2013-03-21T17:34:22.957 に答える
4

同じ効果でスタンドアロンの派生を使用できます。

deriving instance Enum Suit
deriving instance Ord Suit
于 2013-03-21T19:04:08.607 に答える