为了证明例如类别法律适用于某些数据类型的操作,如何决定如何定义相等?考虑到用于表示布尔表达式如下类型:如何定义类别实例的相等性?
data Exp
= ETrue
| EFalse
| EAnd Exp Exp
deriving (Eq)
是否可行试图证明精通形式与身份为ETrue和运营商类别:
(<&>) = EAnd
不需要重新定义式实例?使用默认实例的式的左身份法符,即:
ETrue <&> e == e
评估为假。然而,限定eval函数:
eval ETrue = True
eval EFalse = False
eval (EAnd e1 e2) = eval e1 && eval e2
和等式实例为:
instance Eq Exp where
e1 == e2 = eval e1 == eval e2
修复该问题。根据(==)比较是否声称满足这些法律的一般要求,还是足以说法律适用于特定类型的平等运营商?
您没有义务将'(==)'的默认实现用作结构相等。如果你想让它等同于某种同构,那很好。不过,如果可以通过其他方式轻松区分等价但不相同的值,那么这样做也许是不好的形式。这同样适用于类型法中的“平等”概念。 –
类别在哪里?只是好奇。 –
@ C.A.McCann - 谢谢,在许多情况下,甚至不可能实施适当的比较,所以我认为,至少在monad/monoid/categery定律在某些替代同构方面得到满足方面是完全错误的。 – esevelos