cat.hsについて

main =  do  cs  < - getContents
            putStr cs

getContents は標準入力をすべて読み込むアクションです。
putStrは関数で引数の文字列を標準出力にそのまま返すアクションをします。

この構文の [< - ] を使う事によって、getContentsで入力した文字列が変数に結びつけられます。このように変数と値を結びつける(変数が初期化する) ことをHaskellでは『変数を値に束縛する( bind )』と言います。
束縛されるのは変数なので要注意!
変数の初期化とは
宣言時に値を代入することを初期化と呼びます。
変数は宣言時に必要な値で初期化するか、宣言後に必要な値を代入しなければなりません。
ということは、Haskellは再代入が出来ないから変数は束縛されるという事かな?
このソースでは
1 変数csをgetContents で束縛して標準入力をすべて読み込み
2 csをputStrで標準出力でそのまま出力
3 1と2のアクションをdoでまとめることによってcsを上から下へ実行出来るようになる

getContentsとputStr の2個のアクションをまとめているのがdoである。
do式を使うとまとめられたアクションが上から下へ実行出来るようになる
このdoを使って2個のアクションを実行させるにはインデントが意味を持つのでレイアウトが大切!
ここの段落はとりあえず丸暗記!

そして最後にループの考え方
ループとは反復制御( 同様な処理を繰り返し行う操作をしばしば用いる。これを反復処理またはループと呼ぶ。)の事である。
大きく分けて3種類!
基本ループ:コンピュータプログラムにおいて特定の処理を繰り返すこと、あるいはそのように作られた部分や構造のこと
WHILE LOOP:プログラミング言語において条件が真の間だけ与えられた文の実行を繰り返すループを記述する
FOR LOOP:プログラミング言語において条件が真の間だけ与えられた文の実行を繰り返すというループを記述するための文である。forループは、whileループと違って、ループに入る前の初期化(通常カウンタ変数の初期化を行なう)を含む点で異なる。
以上ループの考え方。
ふつうのHaskellの筆者はdo文を使う事で簡単にループがあるかのように動く事と、遅延評価によりメモリを大量に消費しなくても処理を走らせられるという事を言いたいのでしょうね。

私の勉強法は脳内メモリバカ食い!
遅延評価法で勉強したらもっとサクサク本が読めるのかな?
迷います・・・