最後に出した例ですが、
module Main where main :: IO () main = getLine >>= putStrLn . reverse
さきほどのエントリの図が全部わかれば、以下のような図も書けますね。reverseをfmapで持ち上げて橋を架け、落ちているputStrの左端を>>=で吊るし上げます。この図でできるIO StringからIO ()への関数は、モナドの性質(≒可換性)から、ありがたいことに最初の図でできる関数と同じになります。
この図から、以下のコードが書けます。
module Main where main :: IO () main = fmap reverse getLine >>= putStrLn
Haskellでは関数間の型があうようにコーディングをすることが多いと思いますが、モナドが関数の型に及ぼす効果をダイアグラム上で視覚的に理解すれば、関数、すなわち矢印の組み合わせを考える時のバリエーションが増え、より柔軟にコーディングできるようになります。
ダイアグラムって、本当にありがたいものですね!
10/31 追記 層圏トポス勉強会もやってるよ!
主催者より、モナドで悟りを得たかったら、層圏トポス勉強会にgoとのことです。入会はこちらのGoogle groupsからどうぞ。