top page > computer > haskell > web_lecture > for_programmer > monoid.html
更新日:
文責: 重城良国

モノイドとは

(工事中 60%)

はじめに

「特定の性質をもつ演算ができる」というように表される性質がいくつかある。そのうちのひとつがモノイドである。

モノイドとは

ある演算・と値eがあったとき以下の法則を満たせばそれはモノイドである。

これをモノイド則とよぶ。ひとつめの規則が結合則であり、値を変化させない特別な値eを単位元とよぶ。たとえば整数は演算を加算としてeを0とすればモノイドであり、また演算を乗算としてeを1としてもモノイドとなる。

リストは演算を(++)としてeを[]とすればモノイドとなる。

左結合でも右結合でも結果が変わらない演算があり、その演算に対して相手の値を変化させない値が選べれば、それがモノイドだ。

型クラスMonoid

型クラスMonoidの定義は以下のようになっている。

class Monoid a where
mempty :: a
mappend :: a -> a -> a
mconcat :: [a] -> a

mconcat = foldr mappend mempty

クラス関数mconcatにはデフォルトの定義がある。型によっては効率化のためにmconcatを別に定義するときがあるので関数mconcatはクラス関数となっている。本質的には値memptyと関数mappendだけを考えればいい。

また、型クラスMonoidのインスタンスを作るときは以下のモノイド則が満たされるように注意する必要がある。

モノイド則を満たさなければ、型クラスMonoidのインスタンスであっても、それはモノイドではない。そのようなインスタンスを作ることは数学的な正しさを損うものであり、バグを導くので避けるべきだ。

リスト

リストでは以下のようにモノイドにできる。

インスタンス宣言は以下のようになる。

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

数値型

数値型では足し算とかけ算の両方に対してモノイドとなる。

足し算

足し算に対しては以下のようにモノイドとなる。

足し算に関してのモノイドとしてData.Monoidモジュールで型Sumが定義されている。

newtype Sum a = Sum { getSum :: a }

数値型のラッパーだ。このラッパーは以下のように型クラスMonoidのインスタンスになる。

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

かけ算

数値型はかけ算に対しても以下のようにモノイドとなる。

同様にData.MonoidにProduct型が定義されている。

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

ブール値

ブール値では&&演算と||演算の2通りでモノイドにすることができる。どちらがより本質的ということもないのでnewtypeで新しい型にしてからMonoidのインスタンスにする。

演算&&

ブール値は以下のようにモノイドにできる。

論理積について型Allが定義されている。

newtype All = All { getAll :: Bool }

型Allは以下のように型クラスMonoidのインスタンスになる。

instance Monoid All where
mempty = All True
All x `mappend` All y = All $ x && y

演算||

ブール値は以下のようにモノイドにできる。

型Anyは以下のように型クラスMonoidのインスタンスになる。

instance Monoid Any where
mempty = Any False
Any x `mappend` Any y = Any $ x || y

まとめ

結合則を満たす演算があり、その演算に対して単位元が存在するような値の集合をモノイドとよぶ。Haskellでは型クラスMonoidが用意されていて、いくつかのインスタンスが定義されている。自分で型クラスMonoidのインスタンスを作成するときはモノイド則を満たすようにする必要がある。

「種類(* -> *)に対する型クラス」へもどる 「もっとモノイド」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics