Есть ли способ (каким-либо образом) реализовать ограничения в классах классов?
В качестве примера того, о чем я говорю, предположим, что я хочу реализовать группу как класс типа. Таким образом, тип будет группой, если есть три функции:
class Group a where
product :: a -> a -> a
inverse :: a -> a
identity :: a
Но это не какие-то функции, но они должны быть связаны некоторыми ограничениями. Например:
product a identity = a
product a (inverse a) = identity
inverse identity = identity
и т.д...
Есть ли способ принудительного применения такого ограничения в определении класса, чтобы любой экземпляр автоматически наследовал его? В качестве примера предположим, что я хотел бы реализовать группу C2, определенную следующим образом:
data C2 = E | C
instance Group C2 where
identity = E
inverse C = C
Эти два определения однозначно определяют C2 (указанные выше ограничения определяют все возможные операции - на самом деле C2 является единственно возможной группой с двумя элементами из-за ограничений). Есть ли способ сделать эту работу?