Группа расширяет идею моноида, чтобы разрешить обратные. Это позволяет:
gremove :: (Group a) => a -> a -> a
gremove x y = x `mappend` (invert y)
Но как насчет структур, таких как натуральные числа, где нет инверсных? Я думаю о:
class (Monoid a) => MRemove a where
mremove :: a -> a -> a
с законами:
x `mremove` x = mempty
x `mremove` mempty = x
(x `mappend` y) `mremove` y = x
И дополнительно:
class (MRemove a) => Group a where
invert :: a -> a
invert x = mempty `mremove` x
-- | For defining MRemove in terms of Group
defaultMRemove :: (Group a) => a -> a -> a
defaultMRemove x y = x `mappend` (invert y)
Итак, мой вопрос: что такое MRemove
?