6

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.

Mogsdad
  • 44,709
  • 21
  • 151
  • 275
nponeccop
  • 13,527
  • 1
  • 44
  • 106

2 Answers2

8

(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.

Sjoerd Visscher
  • 11,840
  • 2
  • 47
  • 59
1

It looks like that package provides a Commutative class, so correct me if I'm wrong, but it looks like it's just a matter of specifying a second typeclass:

reduce :: (Monoid m, Commutative m) => (a -> m) -> [a] -> m
damien
  • 902
  • 1
  • 7
  • 12
  • `Commutative` talks about the action of the `Multiplicative` class, not `Monoid`. You could use `(Commutative m, Unital m)` to get a multiplicative commutative monoid that works with `(*)` and `one`, or `(Abelian m, Monoidal m)` to get a commutative monoid that works with `(+)` and `zero`. – Edward Kmett Sep 05 '12 at 22:57