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.
(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
.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With