【Haskell】モナドとは何か

Haskellにおけるモナドとは以下のようなものです。

・モナドとはMonadという型クラスのインスタンス
・IOやMaybe、リストがモナドの実例(Monadのインスタンスは型ではなく、型コンストラクタであることに注意)
・Monadクラスには(>>=)とreturnという2つのクラスメソッドが定義されている

(>>=)とreturnは以下のモナド則を満たす。

1.(return x) >>= f == f x
2.m >>= return == m
3.(m >>= f) >>= g == m >>= (\x -> f x >>= g)

MaybeはMonadインスタンスであるが、Maybeでの(>>=)とreturnの実装を見てみる。

instance Monad Maybe where
    (Just x) >>= f = f x
    Nothing >>= f = Nothing
    return x = Just x

Maybeの(>>=)とreturnの実装が、モナド則を満たすか調べてみる。

1を示す。
(return x) >>= f = (Just x) >>= f = f x
よって、1は示せた。

2を示す。
mにJust xを代入してみる。
(Just x) >>= return = return x = Just x
mにNothingを代入してみる。
Nothing >>= return = Nothing
よって、2は示せた。

3を示す。
mにJust xを代入してみる。
((Just x) >>= f) >>= g = f x >>= g
一方、(Just x) >>= (\x -> f x >>= g) = f x >>= g
mにNothingを代入してみる。
(Nothing >>= f) >>= g = Nothing >>= Nothing
Nothing >>= (\x -> f x >>= g) = Nothing
よって、3は示せた。

以上より、Maybeの(>>=)とreturnの実装はモナド則を満たす。