関数型言語

最近、Haskellを勉強してみようかと思うときがある。

関数型言語はこれが味噌なんだろう。白石さんを問い詰める会で聞いたことと、ヒヤマセミナースノーグローブとゲーデルとマトリックス - hiroki_fの日記で聞いたことのつながりが見えてきた。



なぜ関数プログラミングは重要か

4. プログラムの貼り合せ

関数型言語が用意するもうひとつの新しい種類の糊はプログラム全体を貼り合 せることを可能にする。完成した関数プログラムは入力から出力への一つの関 数にすぎないことを思いおこせ。もし、fとgがそうしたプログラムであるなら、 (g . f)は一つのプログラムであり、入力(input)に適用すると

g (f input)

を計算する。プログラムfはその出力を計算し、それはプログラムgの入力とし て使われる。従来はこれをfからの出力を一時ファイルに蓄えることにより実装 できていた。問題は、この方法でプログラムを貼り合せることが非現実的であ るほど、一時ファイルが非常に多くのメモリを占有する可能性があることであ る。関数型言語はこの問題の解決策を用意している。二つのプログラムfとgは 厳密な同期の上で走る。fはgがいくばくかの入力を読もうとして、 gが読もうとしている出力を供給するのに必要な間だけ走る。それから、fは実 行を中断し、gはさらなる入力を試みるまで実行される。ボーナスとしては、も し、gがfの出力をすべて読むことなく終了すれば、fは破棄される。fは無限に 出力を生成しつづける停止しないプログラムでも構わない。それはgが終了すれ ばすぐに強制的にfは停止させられるからである。これにより、停止条件はルー プの本体とは切離すことができ、強力なモジュール化が可能となる。

この評価方式はfをできるだけ走らせないようにするので、「怠惰(遅延)評価」 と呼ばれている。これにより、ひとつのプログラムを大多数の可能な答を構成 する生成器と適切なものを選ぶ選択器にモジュール化することが現実的なもの となる。いくつかのシステムではプログラムをこのような方法で同時に走らせ ることが可能であるが、関数型言語だけが、すべての関数について一律に遅延 評価を用い、プログラムの任意の部分がこの方法でモジュール化可能である。 遅延評価はおそらく関数プログラマのレパートリの中で最も強力なモジュール 化の道具である。

5. 人工知能からの例

関数型言語が本来、強力なもので、それは、高階関数と遅延評価というふたつ の新しい種類の糊をもつためであると主張した。