Haskell Language
モノイド
サーチ…
リストの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あります。どちらも同じ状況で有効で有用です。したがって、数値の優先インスタンスを選択するのではなく、 Sum
とProduct
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つしかないので、 mempty
とmappend
できることは1つだけです:
instance Monoid () where
mempty = ()
() `mappend` () = ()
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow