do式を使って複数の式を書く時にはインデントを揃えていました。インデントを使う以外にも{ }と;を使って書くこともできます。
オフサイドラインはdo等のあとに現れる単語の位置によって決まるので、以下のどちらの書き方も可能です。
main = do cs <- getContents putStr cs
main = do cs <- getContents putStr cs
あと、式の継続というのがあって、オフサイドラインよりも深くインデントすると前の行の続きになるというルールがあるそうです。
main = do cs <- getContents putStr cs
こう書くとgetContentsは前の行の続きになると。