みどりねこ日記

よくわからないけど、頑張りますよ。

Haskellのモナド3(5)

モノイドについて知らないなら、この記事がわからなくても問題無いです。

モノイドは、幾つかの公理を満たす、単位元(ゼロ)と2項演算(プラス)の2つのメソッドがあるクラスです。

class Monoid m where
	mempty :: m
	mappend :: m -> m -> m

例えば、リストはシンプルなモノイドです。

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

宣言のところで、[]ではなく[a]となっていることに気づいたでしょうか。モノイドはなんらかのコンテナである必要はありません。例えば、整数(実際には自然数もですが)もモノイドを形成することができます。

newtype AdditiveInt = AI Int
newtype MultiplicativeInt = MI Int

instance Monoid AddictiveInt where
	mempty = AI 0
	AI x `mappend` AI y = AI (x + y)

instance Monoid MultiplicativeInt where
	mempty = MI 1
	M1 x `mappend` MI y = MI (x * y)

Monoidは、MonadPlusのインスタンスと非常に似ています。どちらもゼロと加算の機能をもち、当然ですがMonadPlusはMonoidのサブクラスとすることが出来ます。

instance MonadPlus m => Monoid (m a) where
	mempty = mzero
	mappend = mplus

しかし、これらが同じ層で働くことはありません。先程も言いましたが、モノイドがなんらかのコンテナとなる必要はありません。モノイドはkind *を持ちますが、MonadPlusはMonadであるため、kind * -> *だからです。