関数型プログラミング言語は、それが禁止するもので注目に値します。既存の変数またはデータ構造の変更は禁止されています。一部の命令型プログラミング言語では「関数型」でプログラミングできますが、この言語は既存の変数またはデータ構造を誤って変更することから保護しません。たとえばsum、Javaの再帰的で機能的なバージョンは次のとおりです。
int sum(int start, int end) {
if (start > end) return 0;
else {
int total = start + sum(start+1, end);
return total;
}
}
関数型プログラミング言語が優れているのは、それらすべてに「ファーストクラス」の機能があることです。つまり、整数やデータ構造のように、関数を値として使用できます。一部の命令型言語にもファーストクラスの関数(特にCおよびC ++)がありますが、Javaでは単一のメソッド(通常は呼び出されるapply()か何か)を持つオブジェクトで偽造する必要があります。ファーストクラスの関数を使用すると、sum関数を演算子を減らす関数:
interface IntegerOperator {
int apply(int a, int b);
}
int sum(IntegerOperator op, int start, int end) {
if (start > end) return 0;
else {
int total = op.apply(start, sum(op, start+1, end))
return total;
}
}
class AdditionOperator implements IntegerOperator {
int apply(int a, int b) { return a+b; }
}
int total = sum(new AdditionOperator(), 1, 10);
関数型プログラミング言語で記述している場合、すべての関数は実際には関数(同じパラメーターで呼び出されるたびに同じ値を返す)であることを知っているので、次のことを知っています。
int total1 = sum(new ReallyStrangeOperator(), 1, 10);
int total2 = sum(new ReallyStrangeOperator(), 1, 10);
total1total2同じ値を持っている(たとえば、への2番目の呼び出しを最適化できますsum)が、命令型プログラミング言語ではReallyStrangeOperator(1,2)毎回同じ値を返すかどうかについてはわかりません。