9
たとえば、カテゴリの法律がデータ型の一部の操作を保持することを証明するために、どのように等価を定義するかを決定するにはどうすればよいですか?表すブール式のため、以下のタイプを考慮すると:Categoryインスタンスの等価性を定義する方法は?
data Exp
= ETrue
| EFalse
| EAnd Exp Exp
deriving (Eq)
することは、実現可能なことを証明しようとしている経験フォームアイデンティティETrueとオペレータとのカテゴリー:式再定義せずに
(<&>) = EAnd
インスタンス?すなわち、式左アイデンティティ法改の既定のインスタンスを使用して:
ETrue <&> e == e
は偽に評価されます。
eval ETrue = True
eval EFalse = False
eval (EAnd e1 e2) = eval e1 && eval e2
となど式インスタンス:
instance Eq Exp where
e1 == e2 = eval e1 == eval e2
修正問題しかし、eval関数を定義します。このような法律を満たすことを主張するための一般的な要件は(==)であり、特定の型の等価演算子に対して法律が成立していると言うことで十分ですか?
'(==)'のデフォルトの実装を構造的平等として使用する義務はありません。あなたが同型性まで同値を意味することを望むなら、それは問題ありません。しかし、同等ではないが同一の値を他の手段で簡単に区別できる場合は、そうすることはおそらく悪いことです。同じことが型クラス法における「平等」の概念にも当てはまります。 –
カテゴリはどこですか?ちょっと興味があるんだけど。 –
@ C.A.McCann - おかげさまで、多くの場合、適切な比較を行うことさえできないでしょうから、モナド/モノイド/カテゴリ法がいくつかの別の同型異性に関して満足していると主張するのは、少なくとも間違っていると思います。 – esevelos