2012-09-05 4 views
6

La documentation pour algebra/2.1.1.2/doc/html montre un nombre colossal de classes de types. Comment déclarer qu'une structure en question doit être équipée d'une opération associative commutative et d'un élément unité/identité, mais sans autre chose (inverses, distributivité, etc.)?Monoïde commutable du paquet 'algèbre' sur Hackage

Je pense

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

mais les instances de Data.Monoid ne sont pas censés être commutative et je veux les utilisateurs de ma fonction pour voir qu'ils ont besoin commutatif pour la fonction de travailler en regardant le type.

Répondre

8

(Abelian m, Monoidal m)

Il peut sembler que Monoidal est beaucoup plus que vous voulez, mais tout est basé sur Natural étant un Semiring.

+1

C'est la bonne réponse. –

1

Il ressemble à ce paquet fournit une classe commutative, donc me corriger si je me trompe, mais il semble que ce soit juste une question de spécifier une deuxième classe de types:

reduce :: (Monoid m, Commutative m) => (a -> m) -> [a] -> m 
+0

'Commutatif' parle de l'action de la classe' Multiplicative', pas 'Monoid'. Vous pouvez utiliser '(Commutative m, Unital m)' pour obtenir un monoïde commutatif multiplicatif qui fonctionne avec '(*)' et 'one', ou' (Abélien m, Monoïdal m) 'pour obtenir un monoïde commutatif qui fonctionne avec' (+) 'et' zéro'. –