Pergunta

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.

Foi útil?

Solução

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

Outras dicas

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top