関数型(functional)とは? (4/4)


いったい関数型なんて何が嬉しいの?

実際に Scheme について幾つか説明したのですが、確かに define 文を除くと 他に紹介してきた式はすべて「引数」に対して対応する「値」 を返す、数学の世界の「関数」の性質を持ったものでした。 関数の性質は、複数のものを組み合わせても成立します。 ということは、 上述のものだけで書かれたプログラムは「関数」としての性質をもっていることになります。 関数型プログラミングでは、数学的な「関数」としてプログラム中の関数を用いることで、 プログラミングを進めます。つまり、引数と値の関係だけが重要なのです。

一方、 手続き型の世界では、複数の文を次々と実行することで、変数の状態を変化させプログラムの 実行を進めるというプログラミングをおこないます。 C 言語などの void 型の関数などがあり、 しばしばプログラマは呼び出した関数の値を重要視しません。 これは、おこしたい副作用(状態変化)を目的としてプログラムを書いているからです。 このように、関数型と手続き型ではプログラミングの考え方が大きく異なります。

この節の中で、しばしば評価順序についてふれてきました。 関数型においては、実は評価順序は「入力」と「結果」の関係には影響を与えません。 これは、関数型においてはプログラムが関数としての性質を持っているからです。 評価順序が影響を与えるのは、実行効率(無駄な計算をしないようにするため)や プログラムが無限 loop に陥ったりしないかどうか、と言う点だけです。

一方、手続き型言語においては、評価順序は決定的な意味をもちます。 これは、手続き型が「状態の変化」に基づいたプログラミングをしているためです。 つまり、どの様な順番で変化を起こしていくかによって、 最終的な結論が大きく異なってしまうためです()。

このような両者の違いから、関数型言語では以下のような利点が考えられます。


99.9.29/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp