モナドは相変わらずわからないががんばってるよ。

以下の3つは全て同じ意味。a.txtをb.txtにコピーし"OK"を出力

$ runghc -e 'main=readFile "a.txt">>= \s ->writeFile "b.txt" s>>putStrLn "OK"'
OK
$ runghc -e 'main=readFile "a.txt">>= writeFile "b.txt">>putStrLn "OK"'
OK
$ runghc -e 'main=do{s<-readFile "a.txt";writeFile "b.txt" s;putStrLn "OK"}'
OK
$

そうか、>>=と>>は中置演算子だったんだ

Prelude> (>>=) (readFile "a.txt")  putStr
foo
bar
buzz
Prelude> readFile "a.txt" >>= putStr
foo
bar
buzz
Prelude> putStrLn "foo" >> putStrLn "buzz"
foo
buzz
Prelude> (>>) (putStrLn "foo") (putStrLn "buzz")
foo
buzz
Prelude> (>>) ((>>=) (readFile "a.txt")  putStr) (putStrLn "buzz")
foo
bar
buzz
buzz

文字xをyに置換する

Prelude> "abbcxxxxy">>= (\c->if c=='x' then "y" else [c])
"abbcyyyyy"