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?