Haskell 向Eq实例声明代数数据类型
我如何在不使用派生Eq的情况下向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
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。