例如,为了证明类别定律适用于对数据类型的某些操作,如何决定如何定义相等?考虑以下类型来表示布尔表达式:
data Exp
= ETrue
| EFalse
| EAnd Exp Exp
deriving (Eq)
试图证明Exp形成具有身份ETrue和运算符的类别是否可行:
(<&>) = EAnd
没有重新定义Eq实例?使用Eq的默认实例,左恒等式违反了,即:
ETrue <&> e == e
评估为False。但是,定义一个eval 函数:
eval ETrue = True
eval EFalse = False
eval (EAnd e1 e2) = eval e1 && eval e2
和Eq实例为:
instance Eq Exp where
e1 == e2 = eval e1 == eval e2
解决问题。用(==)进行比较是声称满足此类定律的一般要求,还是说这些定律适用于特定类型的相等运算符就足够了?