ありがとうございます。
putChar 'a' >>= (\ha -> putChar 'b' >>= (\hb -> putChar 'c' >>= (\hc -> return (ha:hb:hc:[])))) で、
return (ha:hb:hc:[]) は、「"abc"を出力する動作」で、これが返り値。でも、その返り値は使われてない。
3つの>>=によって「'a'を出力する処理」「'b'出力する処理」「'c'出力する処理」がこの順で実際に実行される。
と言うことですね。

しかし、その形に展開する過程で、たとえば、

mySequence (putChar 'c':[]) = putChar 'c' >>= (\hc -> (return []) >>= (\tc -> return ('c' : tc)))
                          ↓
mySequence (putChar 'c':[]) = putChar 'c' >>= (\hc -> return ('c':[]))

のような展開がありました。
この展開で>>=によって、[]を出力する事になってしまわないのでしょうか。
ここでは[]ですが、ほかに、"c"と"bc"が出力されるような展開がありました。

これらの出力実行はどうなってしまったのでしょうか。展開と評価は別?
展開ってなんでしょう? 評価と同様に、実際に>>=の定義によってなされるものですよね?