semigrupos semigrupo multiplicativo monoides matematicas matematica grupos grupo estructuras estructura discreta definicion composicion algebraicas algebraica abstracta abeliano haskell

haskell - semigrupo - ¿Por qué Int no implementa ''Monoide''?



semigrupo matematica discreta (1)

Int no es un Monoid porque hay más de una implementación obvia de Monoid para Int .

instance Monoid Int where mempty = 0 mappend = (+) instance Monoid Int where mempty = 1 mappend = (*)

La Sum y el Product newtype s definidos en Data.Monoid permiten seleccionar fácilmente qué instancia de Monoid usar con los números.

Dado un Maybe Int , traté de mappend a sí mismo.

$let x = Just 55 :: Maybe Int $mappend x x <interactive>:126:1: No instance for (Monoid Int) arising from a use of `mappend'' In the expression: mappend x x In an equation for `it'': it = mappend x x

Mirando a Maybe , veo:

Monoide a => Monoide (Quizás a)

Como Int no implementa la clase de tipos Monoid , eso explica por qué no puedo usar mappend con Maybe Int .

Pero, recordé de LYAH que puedo usar Sum :

ghci> let x = Sum 55 ghci> mappend x x Sum {getSum = 110}

Pero, ¿por qué no es Int un monoide?