2012-09-05 12 views
6

La documentazione per algebra/2.1.1.2/doc/html mostra un numero enorme di classi di tipi.Commutativo monoide dal pacchetto 'algebra' su Hackage

Come si dichiara che una struttura in questione deve essere dotata di un'operazione associativa commutativa e di un elemento unità/identità, ma senza nient'altro (inversioni, distribuzione ecc.)?

sto pensando di

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

ma le istanze di Data.Monoid non dovrebbero essere commutativa e voglio utenti della mia funzione di vedere che hanno bisogno commutativit'a per la funzione di lavorare guardando il genere.

risposta

8

(Abelian m, Monoidal m)

E ' potrebbe sembrare che Monoidal è molto più di quello che vuoi, ma è tutto basato su Natural che è un Semiring.

+1

Questa è la risposta giusta. –

1

Sembra che pacchetto fornisce una classe commutativa, quindi mi corregga se sbaglio, ma sembra che sia solo una questione di specificare un secondo typeclass:

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

'Commutativo' parla dell'azione della classe' Moltiplicativa', non 'Monoid'. Si potrebbe usare '(Commutative m, Unital m)' per ottenere un monoide commutativo moltiplicativo che funzioni con '(*)' e 'one', o' (Abelian m, Monoidal m) 'per ottenere un monoide commutativo che funzioni con' (+) 'e' zero'. –