Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 988
nponeccop Avatar asked Sep 05 '12 21:09

nponeccop


2 Answers

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

like image 144
Sjoerd Visscher Avatar answered Sep 22 '22 10:09

Sjoerd Visscher


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
like image 35
damien Avatar answered Sep 22 '22 10:09

damien