Haskell 向Eq实例声明代数数据类型

Haskell 向Eq实例声明代数数据类型,haskell,Haskell,我如何在不使用派生Eq的情况下向Eq实例声明此属性 我是否必须针对每一种可能性进行申报,例如: data Weekday = Mon | Tue | Wed | Thu | Fri | Sat | Sun 或者有更聪明的解决方案吗?除非你想搞乱模板Haskell或GHC的派生机制,否则本质上就是这样 instance Eq Weekday where Mon == Mon = True Mon == _ = False

我如何在不使用派生Eq的情况下向Eq实例声明此属性

我是否必须针对每一种可能性进行申报,例如:

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

或者有更聪明的解决方案吗?

除非你想搞乱模板Haskell或GHC的派生机制,否则本质上就是这样

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

基本上就是这样,除非你想搞乱模板Haskell或GHC的派生机制

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

可能不是您想要的,但在本例中,您可以根据Enum定义Eq。例如:

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

Enum实例可以是派生的,也可以是派生的Enum,或者您必须再次声明一个非常详细的实例,就像Fraser所展示的那样。

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

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

Enum实例可以是派生的,也可以是派生的Enum,或者您必须再次声明一个非常详细的实例,就像Fraser所展示的那样。

派生Eq是更聪明的解决方案。否则,是的,你需要定义所有的情况。谢谢你这是我的问题,导出Eq是更聪明的解决方案。否则,对,您需要定义所有案例。谢谢这是我的问题在这种情况下可能足够了,因为我们不太可能在将来添加一周中的新一天,但这是一种非常危险的模式:catch all案例防止typechecker警告您,如果您扩展枚举。对于这个额外的情况,它只会默默地返回False。在这种情况下,这可能就足够了,因为我们不太可能在将来添加一个新的一周中的某一天,但这是一种非常危险的使用模式:catch all情况防止typechecker警告您,如果扩展枚举,则需要修改定义。对于这个额外的情况,它只会默默地返回False。