人気ブログランキング | 話題のタグを見る

Haskell 探検のおわりに

Ubuntu で Hugs をインストールしてから思いがけずはじめてしまった Haskell の探検だが、そろそろ脳が飽和状態になったのでここらでいったんお休みにしたい。何となく Haskell に取り組むときのコツのようなものが分かった気がするのでまとめてみる。

1) Haskell の処理するデータは基本的にはリスト(木構造も含めて)である。リストに表せるデータなら、非常に簡潔にデータの定義ができる。プログラムはデータ構造とアルゴリズムだという言葉があるが、Haskell ではデータ構造の定義が簡単にできる。

2) Haskell がデータを処理するときの基本的な道具は、再帰である。再帰的な定義や関数に習熟すれば非常に簡潔で凝縮したプログラムを書くことができる。また、遅延評価は無限数列を使えるようにするための工夫だと割り切ると、無限数列を気軽に使えるありがたさが分かる。

3) Haskell の内包的な定義は、手続き型言語がループでやるような繰り返しの作業を非常にコンパクトに処理してくれる。また、集合の記法とよく似ており、集合の考え方を流用できる。このため、簡潔でありながら強力な列挙型の操作を定義することができる。

4) 言うまでもないことだが、高階関数は Haskell の強力な武器だ。特に map 関数や filter 関数を活用すると煩わしいループの記述を全く必要としなくなる。また、操作の抽象化ができるため、少ないパターンを組み合わせて多彩な処理を記述することができる。

5) Haskell の関数は実行する順序を問わない。上位の関数を下位の関数の定義に使っても問題が起きない。そのため、記述の順序にこだわらないお気楽プログラミングが可能だ。

6) Haskell の関数の定義は引数のパターンで行われる。このやり方は、人間のパターン認識と親和性があり、アイディアをそのままプログラムに落としこめる感じがする。

7) Haskell の説明を理解しようとするのは難しいが、使うと簡単に感じる。Haskell には高度の理論の成果が織り込まれているが、使う際には単純に関数にどういう引数を与えるとどういう結果が起きるかという感覚的なものでプログラムできる。それは、ひとつには、Haskell の関数は単体でテストできるからだ。全体が組み上がらないとどういうふるまいをするかが分からないということはなく、個々の関数のテストは適切な引数を与えることで簡単に行うことができる。自分で定義した関数がどのようなふるまいをするかをリアルタイムでテストできる。

8) Haskell の難しさは言語の性質によるものではなく、取り扱うアルゴリズムの難しさに左右されている。簡単なアルゴリズムのプログラムなら、Haskell では他の言語よりも簡単に書くことができる。Haskell のサンプルプログラムの難しさは、高度に抽象的なアルゴリズムをそのまま表現できてしまうところにある。言語の使用が難しいのではなく、取り扱っているアルゴリズムが難しいのだ。

9) IOモナドの難しさがよくとりあげられるが、IOモナドはそのなかに手続き型の処理を埋め込んだカプセルのようなものだ。手続き型のプログラムの結果が、関数形プログラミングに悪影響を与えないように隔離してあるためだ。しかし、IOモナドと関数のインターフェースの癖に慣れれば、そう恐れるほどの難しさはないように思われる。

まとまらないまとめになったが、Haskell 初心者なので仕方がない。これからは、少し落ち着いてじっくりHaskell に取り組んでみたい。ちょっとしたアイディアを簡単に検証するための使い捨てプログラム的な使い方には最適なプログラム言語のような気がする。長年欲しがっていた、思考の効率を上げるための道具としてのプログラミング言語が手に入りそうな気がする。アイディアを検証するのに、データ構造の実装や、バグ取りのほうに多くの労力を取られてしまうという事態から解放されそうだ。

最後に Haskell は学ぶことから始めると非常に難しく感じるが、とにかく使ってみるととても簡単に感じるプログラム言語だ。まさに、「習うより慣れよ」とはこの言語のための言葉のようだ。
by tnomura9 | 2009-08-11 00:31 | Haskell | Comments(0)
<< クイックソート Haskell 木で遊ぶ >>