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 * -> *だからです。