>>767
IO a型の値(動作と呼ぶ)は単なるデータで、それ自体が何かをする訳ではない。
例えば、getLine :: IO Stringは「標準入力から一行読むこと」を表すデータに過ぎないので、
getLineを評価しても何も起こらない。(これは、1 + 1を評価しても何も起こらない、というのと同じ)
同様に、putStrLn "Hello"を評価しても、「標準出力にHelloと表示すること」というデータが返ってくるだけで、
実際にHelloが出力される訳ではない。
ではどうやって実際に動作を実行するかというと、mainを実行したい値に束縛すれば良い。
Haskell処理系は、mainの値(mainの型はIO aなので、これは動作)を実際に実行する。
これ以外に動作を実行する方法はない。

(>>)は、二つの動作を組み合わせて一つの動作にする関数。
具体的には、
a >> b
は、
「aを実行し、次にbを実行すること」
を表す動作になる。(>>)はあくまで動作というデータ間の演算であり、
実際に動作を実行する訳ではないことに注意して欲しい。
ここで、aとbを評価する順序は未規定だが、
どうせ評価しても何も起こらないので、大した問題ではない。