たとえば、カテゴリの法則がデータ型の一部の操作に適用されることを証明するために、等値を定義する方法をどのように決定すればよいでしょうか? ブール式を表すために次のタイプを検討します。
data Exp
= ETrue
| EFalse
| EAnd Exp Exp
deriving (Eq)
Expが ID 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
問題を修正します。(==)に関する比較は、そのような法則を満たしていると主張するための一般的な要件ですか、それとも特定のタイプの等値演算子に対して法則が成り立つと言うだけで十分ですか?