「関数型プログラミング」という用語には 2 つの意味があります。
最初の意味は、関数を操作するプログラムの能力です。すべての言語でこれができるわけではありませんが、javascript はできる言語の 1 つです。関数を変数に代入し、関数を引数に渡し、関数を返すことができる言語は関数型プログラミング言語と呼ばれるため、javascript はそのまま機能します。
この意味で、コールバックが一般的に使用されている最新の JavaScript コードを見ると、すでに関数型プログラミングを行っていることになります。
関数型プログラミングの 2 つ目の意味は、プログラム構成の主要な方法が変数ではなく関数であるプログラミング スタイルです。この意味で、ほとんどすべての言語は、変数の割り当てとループ構造を回避することで関数型スタイルで使用できます (代わりに再帰を使用してください)。
関数型コミュニティを見ると、関数型とは、最初の意味に加えて、2 番目の意味の非常に強力なバージョンを意味します。つまり、変数は回避されるだけでなく、禁止されます。Haskell のような言語には、変数の概念がありません。I/O のような副作用や変更可能な状態を処理するために、モナドと呼ばれる概念を使用します。
そこまで行く必要はありません。Lisp や Forth などの古典的な関数型言語では、変数を使用できました。可能な限りそれらを避ける必要があります。
Lisp および Forth スタイルの関数型プログラミングは、一時変数に何も割り当てずにリスト/配列を処理することによって大きく駆動されます。一部の人にとっては、このスタイルの方が読みやすいです。命令型スタイルでこれを行う場所:
var a = [1,2,3];
var b = 0;
for (var i=0;i=a.length;i++) {
b += a[i] * 2;
}
// result is in b
機能的なスタイルでは、次のようにします。
[1,2,3].
map(function(x){return x*2}).
reduce(function(x,y){return x+y},0);
概念的には、機能的なスタイルでは、配列を反復処理するのではなく、配列にフィルターを適用しているように見えます。このようなコマンド ライン ツールを使用したことがあるgrep
場合は、この概念が非常によく知られていることに気付くでしょう。
関数型スタイルでは、変数の代入をまったく導入していないことに注意してください。
関数型スタイルの 3 つの主要な配列メソッド/関数は、map
、reduce
およびfilter
です。それらを使用すると、for ループの 90% などを回避できます。