Subclasses of Monoid with a solid theoretical foundation and practical purposes
ReductiveMonoid provides the operator
</>which acts as a partial inverse of the
CancellativeMonoid is a subclass of
ReductiveMonoidthat provides additional guarantees about the
(a <> b) </> a == Just b (a <> b) </> b == Just a
Every group (i.e., every
Monoid awith the operation
inverse :: a -> a) is a
a </> b = Just (a <> inverse b)but not every
CancellativeMonoidis a group.
GCDMonoid is a subclass of
ReductiveMonoidthat provides the
gcdoperation for getting the greatest common denominator for two given monoid values.
MonoidNull class provides the Boolean
nulloperation that checks if the argument monoid is
FactorialMonoid class represents monoids that can be split up into irreducible factors.
That's the theoretical point of view. From the practical point of view, the main purpose of the monoid-subclasses package is similar to that of ListLike - to provide unifying abstractions for various monoidal data types in Haskell, primarily String, ByteString, and Text. All three types are already instances of the Monoid class. While that abstraction is useful for building sequences of data, it doesn't help with deconstructing them.
That being said, there are two major differences in the goals of ListLike and monoid-subclasses:
- ListLike strives to reproduce the standard Data.List interface, whereas monoid-subclasses builds from deeper theoretical foundations; and
- The monoid-subclasses implementation uses standard Haskell 2010, with the exception of two minor extensions which can be worked around if necessary.
A more thorough description of the library can be found in the Haskell Symposium 2013 paper Adding Structure to Monoids