RWH の読み方(57) 第7章

Real World Haskell 第7章 I/O

第7章の最後の部分は、バッファの扱い方や、環境変数の取得の仕方などI/O関連の話が簡単に説明されている。これで、Real World Haskell も第7章まで読了したことになる。

Haskell の言語としての特徴の説明は第7章までで完了しているようだ。第8章以下はいよいよ Haskell を実際的に活用するにはどうするかという話になってくるが、それだけに背景となる知識の準備がいるし、このプログで記事にしていくのは少々無理がある。

そういうわけで、Real World Haskell を読むという一連の記事は今回で終わりにしたい。Haskell を学ぶ上で管理人が躓いたところについては、Real World Haskell の本文を逸脱して記述した。これまでの一連の記事が Real World Haskell を読みこなす上でのキックスタートになることができれば幸いだ。

Is Haskell Really Imperative

do ブロックの中には手続き型言語と同じようなプログラムが書けるが、Haskell の本質は遅延評価だ。I/Oと純粋関数の世界はうまく隔離されている。

Side Effects with Lazy I/O

純粋関数のプログラムでも副作用が発生しないことはない。不適切なループの記述でメモリの使用が大きくなりすぎてクラッシュしたり、ディスクとのスワップが発生したりする。また、hGetContents はI/O処理に遅延評価を導入してくれるので便利だが、ユーザとのインタラクティブなやり取りをする用途には、不適切かもしれない。

Buffering

I/O 処理のサブシステムは速度が遅いため、バッファリングが必要だ。しかし、プログラムの種類によっては操作性の必要からバッファリングモードを変更することが必要な場合も出てくる。Haskell でもこのようなバッファリングの制御のための仕組みが備わっている。

Buffering Modes

Haskell には3種類のバッファリングモードがある。それらは BufferMode 型として定義されていて、データコンストラクタはそれぞれ、NoBuffering, LineBuffering, BlockBuffering だ。

NoBuffering モードでは文字通りバッファリングを行わない。hGetLine 関数はOSから1文字ごとにデータを受け取る。データを書き込むときも1文字ずつ直ちに書き込まれる。このため、NoBuffering モードは処理能力が低く、一般的には使われない。

LineBuffering モードでは、データは1行毎に取り込まれたり、書き込まれたりする。このモードが普通デフォールトになっている。

BlockBuffering モードは、固定長のバッファで動作する。バッチ処理などで大量の情報を処理するのには向いているが、インタラクティブなぷろぐらむには適さない。

バッファの操作のための関数としては、hGetBuffering と hSetBuffering がある。

Flushing The Buffer

バッファのフラッシュを行う関数には hFlush がある。

Reading Command-Line Arguments

コマンドライン引き数を取得する関数は System.Environment.getArgs 関数だ。プログラム名は System.Environment.getProgramName で取得できる。

コマンドラインオプションを取得するための関数は、System.Console.Getopt モジュールに定義されている。

Environment Variables

環境変数の値は、System.Environment:getEnv または getEnvironment.getEnv 関数で取得できる。
[PR]
by tnomura9 | 2012-07-08 05:02 | Haskell | Comments(0)
<< 1週間で3オクターブの声が出せ... MAP >>