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?