Portability | portable (but instances use MPTCs) |
---|---|

Stability | experimental |

Maintainer | ekmett@gmail.com |

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`

# Documentation

class Multiplicative m whereSource

Multiplicative Int | |

Multiplicative Integer | |

Monoid m => Multiplicative [m] | |

Integral m => Multiplicative (Ratio m) | |

Monoid n => Multiplicative (IO n) | |

Monoid n => Multiplicative (ZipList n) | |

Multiplicative m => Multiplicative (Dual m) | |

Monoid m => Multiplicative (Maybe m) | |

Monoid m => Multiplicative (Seq m) | |

Multiplicative m => Multiplicative (Self m) | |

Monoid m => Multiplicative (Exp m) | |

Monoid m => Multiplicative (Const m a) | |

(Measured v m, Monoid m) => Multiplicative (FingerTree v m) | |

(Applicative f, Monoid a) => Multiplicative (Alt f a) | |

(Monad m, Monoid a) => Multiplicative (MonadSum m a) |

# Multiplicative to Monoid

Convert a `Multiplicative`

into a `Monoid`

. Mnemonic: `Log a + Log b = Log (a * b)`

Multiplicative m => Monoid (Log m) | |

MultiplicativeGroup g => Group (Log g) |

# Monoid to Multiplicative

Convert a `Monoid`

into a `Multiplicative`

. Mnemonic: `Exp a * Exp b = Exp (a + b)`

Monoid m => Multiplicative (Exp m) | |

Group g => MultiplicativeGroup (Exp g) |