为什么Int不实施' Monoid'?

时间:2015-04-07 18:56:52

标签: haskell

鉴于Maybe Int,我尝试mappend给自己。

$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

Maybe,我看到了:

  

Monoid a =&gt; Monoid(可能是a)

由于Int没有实现Monoid类型类,这就解释了为什么我无法将mappendMaybe Int一起使用。

但是,我记得LYAH我可以使用Sum

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

但是,为什么不是Int一个Monoid?

1 个答案:

答案 0 :(得分:38)

Int不是Monoid,因为Monoid有多个明显的Int实施。

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

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

newtype中定义的Data.Monoid SumProduct可让您轻松选择要与数字一起使用的Monoid个实例。