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


関数型と手続き型
あるいは----
関数プログラミングって結局なに? C 言語は関数型ではないの?

C や Java でも手続きの事を関数(function)といっています。 では、C 上での普通のプログラミングは関数型プログラミングかというと、 違います。 つまり、C では「変数への代入」があり、 プログラムの状態(各変数がどのような値を各時点で表しているか)が遷移していく というプログラミングを行うのですが、関数プログラミングではしません。 関数プログラミングの世界では、このような状態の変化は副作用といわれて、 あまり使わないようにします。

振り返ってみると、 関数プログラムの特徴は、プログラムの「関数」が数学の「関数」と近い意味をもっている とはじめにいいました。 つまり、引数のとる値が同じであれば、関数のとる値は同じであるわけです。

一方、状態を用いたプログラミングの例(Cをつかう)を見てみましょう。

	int global_var = 3;
	int foo (int x) { global_var++; return (x + global_var); }
	void main () {
           const int a = 4;
	   foo(3); /* will return value 7 */
	   foo(3); /* will return value 8 */
	   global_var = 0;
	   foo(3); /* will return 4 */
	}
この場合、foo(3) の値は、実行される毎に変化していきます。 これは、global_var という変数が状態を持ち、foo が呼ばれる毎に異なった値を返すからです。 つまり、「関数の返り値」が「引数の値」にだけよるのではなく、「メモリの状態」に影響 されるからであり、数学の「関数」の持つ性質とは大きく異なります。

ということで、C 言語でかかれた普通のプログラムは関数プログラミングされていませんし、 よって、 C 言語も関数型言語とは呼ばれません。

とはいえ、C で関数型なプログラミングをしてもらっても構いません。 例えば、先程のプログラムの例なら

	int mul (int x, int y) { return (x * y); }
	int main () {
           const int a = 4;
	   return (mul(a, mul(2, a)));
	}
などと書けば、関数プログラミングをしているといっても罰はあたらないでしょう。
99.9.29/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp