将代数数据类型声明为Eq

时间:2015-07-21 13:35:57

标签: haskell

data Weekday = Mon | Tue | Wed | Thu | Fri | Sat | Sun

如何在不使用deriving Eq

的情况下将此声明声明为Eq实例

我是否必须为每一种可能性声明它,如:

instance Eq Weekday where
                   Mon == Mon = True
                   Mon == _ = False
                   _ == Mon = False
                   Tue == Tue = True
                   ... == ... = ..

还是有更聪明的解决方案吗?

2 个答案:

答案 0 :(得分:9)

除非您想要使用模板Haskell或GHC的派生机制,否则它本质上就是这样。

instance Eq Weekday where
  Mon == Mon = True
  Tue == Tue = True
  Wed == Wed = True
  Thu == Thu = True
  Fri == Fri = True
  Sat == Sat = True
  Sun == Sun = True
  _ == _ = False

答案 1 :(得分:1)

可能不是你想要的,但在这种情况下你可以用Enum来定义Eq。例如:

data Weekday = Mon | Tue | Wed | Thu | Fri | Sat | Sun

instance Eq Weekday where
     a == b = fromEnum a == fromEnum b

Enum实例可以派生,deriving (Enum),或者你再一次必须做出一个相当冗长的实例声明,就像Fraser所展示的那样。

相关问题