haskellabstract-algebra

What are structures with "subtraction" but no inverse?


A group extends the idea of a monoid to allow for inverses. This allows for:

gremove :: (Group a) => a -> a -> a
gremove x y = x `mappend` (invert y)

But what about structures like natural numbers, where there is no inverse? I'm thinking about:

class (Monoid a) => MRemove a where
    mremove :: a -> a -> a

with laws:

x `mremove` x = mempty
x `mremove` mempty = x
(x `mappend` y) `mremove` y = x

And additionally:

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)

So, my question is: what is MRemove?


Solution

  • The name you're looking for is cancellative monoid, though strictly speaking a cancellative semigroup is enough to capture the concept of subtraction. I was wondering about the very same question a year or so ago, and I found the answer by digging through mathematical jargon. Have a look at the CancellativeMonoid class in the incremental-parser package. I'm currently preparing a new package that would contain only the monoid subclasses and a few of their instances, and I hope to release it soon.