使自定义数据类型成为可能

时间:2013-03-21 04:22:23

标签: haskell types functional-programming

有人可以向我解释如何制作自定义数据类型吗?

**我不允许对Suit本身进行修改,例如。推导(Eq,Ord)

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

我的尝试:

instance Ord Suit where
    compare suit1 suit2 = compare suit1 suit2

但这似乎是连续循环并且不会停止。

3 个答案:

答案 0 :(得分:8)

Ord的定义看起来像(但不完全)

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

Ordering有三个可能的值: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

您的实际订购可能会有所不同,但这应该会为您提供基本的想法。

答案 1 :(得分:4)

您可以使用具有相同效果的standalone deriving

deriving instance Enum Suit
deriving instance Ord Suit

答案 2 :(得分:3)

编写自定义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

在这里,您只需提及一次构造函数,就可以轻松决定不同的顺序。

您也可以使用compare Data.Function.on relativeRank,但这可能更容易理解。