群はモノイドの考え方を拡張して逆を可能にします。これにより、次のことが可能になります。
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
です。