Per provare che, per esempio, le leggi di categoria sono valide per alcune operazioni su un tipo di dati, come decidere se definire l'uguaglianza? Considerando il seguente tipo per che rappresentano le espressioni booleane:Come definire l'uguaglianza per le istanze di categoria?
data Exp
= ETrue
| EFalse
| EAnd Exp Exp
deriving (Eq)
E 'fattibile cercando di dimostrare che Exp forma una categoria con un'identità ETrue ed esercente:
(<&>) = EAnd
senza ridefinire il Eq esempio? Utilizzando l'istanza predefinita di Eq le sinistra-identità pause di legge, vale a dire:
ETrue <&> e == e
viene valutato come False. Tuttavia, definente una funzione eval:
eval ETrue = True
eval EFalse = False
eval (EAnd e1 e2) = eval e1 && eval e2
e esempio Eq come:
instance Eq Exp where
e1 == e2 = eval e1 == eval e2
risolve il problema. Il confronto in termini di (==) è un requisito generale per richiedere di soddisfare tali leggi, o è sufficiente dire che le leggi valgono per un particolare tipo di operatore di uguaglianza?
Non sei obbligato a utilizzare l'implementazione predefinita di '(==)' come uguaglianza strutturale. Se vuoi che significhi equivalenza fino ad un certo isomorfismo, va bene. Forse è una cattiva forma farlo se però valori equivalenti ma non identici possono essere facilmente distinti con altri mezzi. Lo stesso vale per la nozione di "uguaglianza" nelle leggi sulla classe del tipo. –
Dov'è la categoria? Solo curioso. –
@ C.A.McCann - Grazie, in molti casi, non sarebbe nemmeno possibile implementare un confronto adeguato, quindi suppongo che non sia del tutto sbagliato sostenere che le leggi monad/monoid/categoriche siano soddisfatte rispetto ad alcuni isomorfismi alternativi. – esevelos