Search code examples
haskellhackageabstract-algebra

Commutative monoid from 'algebra' package on Hackage


The documentation for algebra/2.1.1.2/doc/html shows a colossal number of type classes.

How do I declare that a structure in question must be equipped with a commutative associative operation and a unit/identity element, but without anything else (inverses, distributivity etc)?

I'm thinking of

reduce :: Monoid m => (a -> m) -> [a] -> m

but instances of Data.Monoid are not supposed to be commutative and I want users of my function to see that they need commutativity for the function to work by looking at the type.


Solution

  • (Abelian m, Monoidal m)

    It might seem that Monoidal is much more than you want, but it is all based on Natural being a Semiring.