When dealing with a Ring or other structure, you often need a pair of
Monoid instances that are closely related. Making a newtype for one
is unsatisfying and yields an unnatural programming style.
A Multiplicative is a Monoid that is intended for use in a scenario
that can be extended to have another Monoid slot in for addition. This
enables one to use common notation.
Any Multiplicative can be turned into a Monoid using the Log wrapper.
Any Monoid can be turned into a Multiplicative using the Exp wrapper.
Instances are supplied for common Monads of Monoids, in a fashion
which can be extended if the Monad is a MonadPlus to yield a RightSemiNearRing
Instances are also supplied for common Applicatives of Monoids, in a
fashion which can be extended if the Applicative is Alternative to
yield a RightSemiNearRing
|