Para demostrar que, por ejemplo, las leyes de categoría tienen algunas operaciones en un tipo de datos, ¿cómo se decide cómo definir la igualdad? Teniendo en cuenta el siguiente tipo de representación de expresiones booleanas:¿Cómo se define la igualdad para instancias de categoría?
data Exp
= ETrue
| EFalse
| EAnd Exp Exp
deriving (Eq)
¿Es factible tratar de demostrar que Exp forma una categoría con la identidad ETrue y operador:
(<&>) = EAnd
sin redefinir el ecuación ¿ejemplo? El uso de la instancia predeterminada de la ecuación los izquierda identidad rompe la ley, es decir:
ETrue <&> e == e
evalúa a Falso . Sin embargo, la definición de una función de eval:
eval ETrue = True
eval EFalse = False
eval (EAnd e1 e2) = eval e1 && eval e2
y la Eq ejemplo como:
instance Eq Exp where
e1 == e2 = eval e1 == eval e2
soluciona el problema. ¿Es la comparación en términos de (==) un requisito general para solicitar el cumplimiento de dichas leyes, o es suficiente decir que las leyes son válidas para un tipo particular de operador de igualdad?
No está obligado a utilizar la implementación predeterminada de '(==)' como igualdad estructural. Si quieres que signifique equivalencia hasta cierto isomorfismo, está bien. Sin embargo, es una mala forma hacerlo si se pueden distinguir fácilmente los valores equivalentes pero no idénticos por otros medios. Lo mismo aplica para la noción de "igualdad" en las leyes de clases de tipos. –
¿Dónde está la categoría? Sólo curioso. –
@ C.A.McCann - Gracias, en muchos casos ni siquiera sería posible implementar una comparación adecuada, así que supongo que al menos no es del todo incorrecto argumentar que las leyes de mónada/monoide/catequesis están satisfechas con respecto a algún isomorfismo alternativo. – esevelos