catコマンド

お次はUnixでおなじみのcatコマンド、標準入力を画面に出力するだけのコマンドです。

main = do cs <- getContents
          putStr cs

さぁ、わけのわからんのが出てきました。

まずdo式から、これは複数のアクションをまとめる式で、まとめられたアクションは上から下に実行される。
getContentsは標準入力を読み込むアクション(関数ではなくアクション)
その結果を<-演算子でcsという変数に代入している。これを代入ではなく「束縛」というらしい。
そして、csの内容をputStr関数で画面に出力する。これはputStrLnと違い最後に改行を出力しない。

これを見ると普通なら以下のような式が成り立つと考えてしまう。

main = putStr getContents

しかし、putStr関数が引数に文字列を受け取るのに対し、getContentsアクションの戻り値は「文字列を得られるアクション」であるため型エラーが出る。
この辺がよくわからないが、とりあえず先に進もう。