Подтвердить что ты не робот

Почему Int не реализует "моноид"?

Учитывая 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, я вижу:

Моноид a = > Моноид (возможно, a)

Так как Int не реализует класс типа Monoid, это объясняет, почему я не могу использовать mappend с Maybe Int.

Но я вспомнил из LYAH, что могу использовать Sum:

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

Но почему не Int моноид?

4b9b3361

Ответ 1

Int не является Monoid, потому что существует более чем одна очевидная реализация Monoid для Int.

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

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

newtype Sum и Product, определенный в Data.Monoid, позволяет вам легко выбрать, какой экземпляр Monoid использовать с числами.