10. ここで(>>=)を見てみましょう。
(>>=) :: m a -> (a -> m b) -> m b
例えば...
Maybeでは、m aのaを(a -> m b)に渡すため、
Just aなのかNothingなのかどうか判定している
Readerでは、m aのaを(a -> m b)に渡すため、
関数に、足りない分の引数を与えている
Parserでは、m aのaを(a -> m b)に渡すため、
与えられた文字列を消費している
11. ここで(>>=)を見てみましょう。
(>>=) :: m a -> (a -> m b) -> m b
いずれも、
m aのaを(a -> m b)に渡すために、
必要な処理をそれぞれ持っている。
そして、
(a -> m b)が返したm bをまた別の関数に渡すよう、必要な処理を繰り返している。
12. つまり!!
Monadは(>>=)のm aのaを(a -> m b)に渡す部分に、
やらなければならないことをすべて押し込んでいる!
(a -> m b)が値を返す度に、
別の(a -> m b)な関数にMonadに包まれていない値を渡すために、
やらなければならないことを(>>=)に任せている。
13. 要するに!!
(a -> m b)という型の、
値を返す度に、やらなければならないことがある関数
がいっぱいある時、Monadは役に立つ。