2012-09-16 12 views
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関数を定義します。このような法律を満たすことを主張するための一般的な要件は(==)であり、特定の型の等価演算子に対して法律が成立していると言うことで十分ですか?

+8

'(==)'のデフォルトの実装を構造的平等として使用する義務はありません。あなたが同型性まで同値を意味することを望むなら、それは問題ありません。しかし、同等ではないが同一の値を他の手段で簡単に区別できる場合は、そうすることはおそらく悪いことです。同じことが型クラス法における「平等」の概念にも当てはまります。 –

+2

カテゴリはどこですか?ちょっと興味があるんだけど。 –

+0

@ C.A.McCann - おかげさまで、多くの場合、適切な比較を行うことさえできないでしょうから、モナド/モノイド/カテゴリ法がいくつかの別の同型異性に関して満足していると主張するのは、少なくとも間違っていると思います。 – esevelos

答えて

関連する問題