【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の実装はモナド則を満たす。