数字幺半群

数字是用两种方式 monoidal: 除了以 0 为单位,和乘法以 1 为单位。两者在不同情况下同样有效且有用。因此,不是选择数字的首选实例,而是有两个 newtypesSumProduct 来标记它们以获得不同的功能。

newtype Sum n = Sum { getSum::n }

instance Num n => Monoid (Sum n) where
    mempty = Sum 0
    Sum x `mappend` Sum y = Sum (x + y)

newtype Product n = Product { getProduct::n }

instance Num n => Monoid (Product n) where
    mempty = Product 1
    Product x `mappend` Product y = Product (x * y)

这有效地允许开发人员通过将值包装在适当的 newtype 中来选择要使用的功能。

Sum 3     <> Sum 5     == Sum 8
Product 3 <> Product 5 == Product 15