サーチ…


リストのMonoidのインスタンス

instance Monoid [a] where
    mempty  = []
    mappend = (++)

このインスタンスのMonoid法の確認:

mempty `mappend` x = x   <->   [] ++ xs = xs  -- prepending an empty list is a no-op

x `mappend` mempty = x   <->   xs ++ [] = xs  -- appending an empty list is a no-op

x `mappend` (y `mappend` z) = (x `mappend` y) `mappend` z
    <->
xs ++ (ys ++ zs) = (xs ++ ys) ++ zs           -- appending lists is associative

モノイドのリストを単一の値に集約する

mconcat :: [a] -> a 、別のある方法Monoid型クラス

ghci> mconcat [Sum 1, Sum 2, Sum 3]
Sum {getSum = 6}
ghci> mconcat ["concat", "enate"]
"concatenate"

デフォルトの定義はmconcat = foldr mappend memptyです。

数値モノイド

ユニットとしての0との付加 、及び単位として1との乗算 :数字は、2つの方法でmonoidalあります。どちらも同じ状況で有効で有用です。したがって、数値の優先インスタンスを選択するのではなく、 SumProduct 2つのnewtypesタイプがあり、それぞれ異なる機能のためにタグ付けします。

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

Monoid for()のインスタンスは、

()Monoidです。 type ()は値が1つしかないので、 memptymappendできることは1つだけです:

instance Monoid () where
    mempty = ()
    () `mappend` () = ()


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow