2012-09-05 7 views
6

La documentación para algebra/2.1.1.2/doc/html muestra un número colosal de clases de tipos.Monoide conmutativo del paquete 'álgebra' en Hackage

¿Cómo puedo declarar que una estructura en cuestión debe estar equipada con una operación asociativa conmutativa y un elemento unidad/identidad, pero sin nada más (inversas, distributividad, etc.)?

Estoy pensando en

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

pero no se supone que los casos de Data.Monoid ser conmutativa y quiero usuarios de mi función para ver que necesitan conmutatividad para la función de trabajar mirando el tipo.

Respuesta

8

(Abelian m, Monoidal m)

Se Puede parecer que Monoidal es mucho más de lo que desea, pero todo se basa en Natural siendo Semiring.

+1

Esta es la respuesta correcta. –

1

Parece que el paquete proporciona una clase conmutativa, por lo que me corrija si estoy equivocado, pero parece que es sólo una cuestión de especificar una segunda clase de tipos:

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

'Commutative' se refiere a la acción de la clase' Multiplicative', no 'Monoid'. Podrías usar '(conmutativa m, unital m)' para obtener un monoide conmutativo multiplicativo que funciona con '(*)' y 'uno', o' (m abeliano, monoidal m) 'para obtener un monoide conmutativo que funcione con' (+) 'y' cero'. –

Cuestiones relacionadas