モナドの実行順序と実際の評価の順序は必ずしも一致しないじゃないですか

putStr "begin..."
value <- heavyProcess
putStr "done."
print value

これはbegin...done.と表示した後にようやくheavyProcessが動き出すじゃないですか

もう何を信じていいのかわからないじゃないですか