読書メモ第9章はIOの続き。ファイルの読み書き、乱数生成、コマンドライン引数について。前の章と違って具体例が中心である。ファイルとストリームストリームはプログラムに出入りするデータの流れのことを言う。haiku.txtのようにしてファイルを標準入力から取り込むことを考える。ハスケルではファイルからの入力も遅延評価できる。contentsgetContentsは遅延評価されるので、インプットのテキストやターミナルからの入力を必要になった時に取り込むようになっている。shortLinesOnlyinteractはStringをとってStringを返す関数をとって、IOアクションを返す。このIOアクションは入力に引数にとった関数を適用した結果を表示する。ファイルの読み書き前のパートで標準入力、出力での読み書きが分かったのでファイルからの入出力を考える。ファイルからの入出力の概念は標準入出力とあまり変わらない。contents)このプログラムで目新しいのはopenFile、h...である。ReadWriteModeというデータ型になっている。hGetContentsとhCloseはどのファイルを取り扱うか示すものである、ハンドルを引数に取る。withFileを使えばハンドルを開放し忘れることはない。handle)のようになる。cで2つ目の引数はエラーが起こった時に呼ばれる関数、3つ目の引数は問題ない時に呼ばれる関数である。テキストファイルの読み書きはよくある操作なので専用の関数もある。readFile、writeFile、appendFileである。contentsコマンドライン引数System.EnvironmentのgetArgs関数を使う。型シグネチャはIO[String]で、コマンドライン引数のリストを返す。Stringというものもあり、プログラムの名前を返す。fileName)オンライン版をコピペしてきたものだが手元で印刷した古いバージョン(ハードコーディングしてあったファイル名の書き換え忘れ間違いがあった...)と違うところは最後に書き足した。(オンライン版はMaybeを使っている。自分はこちらできちんと動くならこの書き方のほうが好きと感じる。)removeについて補足すると、openTempFileという関数が使われている。Handle)で、上の例では"."で現在のディレクトリ、"temp"でファイル名が指定され一時ファイルを作成するアクションと、返り値としてファイルの名前とハンドルを返す。Control.ExceptionのbracketOnErrorがエラーハンドリングバージョンとして作られている。bracketOnErrorはbracketと違い、エラーがなければハンドルを開放しない。乱数生成System.Randomをインポートして利用する。random関数に乱数ジェネレータgを与える。