Есть ли способ ( любой способ) реализовать ограничения в классах типов?
В качестве примера того, о чем я говорю, предположим, что я хочу реализовать группу как класс типов. Таким образом, тип будет группой, если есть три функции:
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 является единственно возможной группой с двумя элементами из-за ограничений). Есть ли способ сделать эту работу?