C'è un modo (qualsiasi modo) per implementare i vincoli nelle classi di tipi?C'è un modo per implementare i vincoli nelle classi di tipi di Haskell?
Come esempio di ciò di cui sto parlando, supponiamo di voler implementare un gruppo come classe di tipo. Quindi un tipo sarebbe un gruppo se ci sono tre funzioni:
class Group a where
product :: a -> a -> a
inverse :: a -> a
identity :: a
Ma quelle non sono le funzioni, ma devono essere legati da alcuni vincoli. Per esempio:
product a identity = a
product a (inverse a) = identity
inverse identity = identity
ecc ...
C'è un modo per far rispettare questo tipo di vincolo nella definizione della classe in modo che qualsiasi istanza sarebbe automaticamente ereditare? Come esempio, supponiamo desidero attuare il gruppo C2, definita da:
data C2 = E | C
instance Group C2 where
identity = E
inverse C = C
Queste due definizioni determina univocamente C2 (vincoli sopra definiscono tutte le possibili operazioni - infatti, C2 è l'unico gruppo possibile con due elementi a causa dei vincoli). C'è un modo per farlo funzionare?
(Er, 'inverso C = C', sicuramente?) – dave4420
sì, grazie per aver notato –
Questi vincoli sono solitamente chiamati * leggi * esempio, leggi Monad. – mb14