「関数型プログラミング」の「関数」って何のこと?
解説
正解は「数学の関数のように入力→出力を返す処理」です。関数型プログラミングにおける「関数」は、JavaScriptの function キーワードやクラスのメソッドを指しているわけではありません。数学の f(x) = x + 1 のように、入力が決まれば出力が一意に決まる対応関係のことです。この考え方を軸にプログラムを組み立てるスタイルを関数型プログラミングと呼びます。数学の関数とプログラミングの関数は違う多くのプログラミング言語で「関数」と呼ばれるものは、数学の関数より自由度が高いです。外部の変数を書き換えたり、画面に文字を出力したり、データベースにアクセスしたりできます。これらは「入力→出力」の対応関係とは無関係な動作で、副作用と呼ばれます。// 数学の関数に近い(副作用なし) function double(x) { return x * 2; } // 数学の関数とは違う(副作用あり) let count = 0; function increment() { count += 1; // 外の変数を書き換えている }関数型プログラミングは、できるだけ前者のような「数学の関数に近い関数」でコードを書こうとするアプローチです。なぜ今「関数型」が注目されるのか関数型プログラミング自体は1950年代のLISPに遡る古い考え方ですが、近年あらためて注目されている理由があります。UIフレームワークとの相性: Reactは「同じ props を渡せば同じ表示になる」という関数型の発想で設計されています。クラスコンポーネントから関数コンポーネントへの移行もこの流れですバグの減少: データを直接書き換えない(イミュータブル)スタイルは、「いつ・誰が値を変えたか」の追跡が不要になり、予期しないバグが減りますテストのしやすさ: 同じ入力に同じ出力を返す関数は、外部の状態を準備する手間なくテストできます3つのプログラミングスタイルを比べてみる「配列の数値を2倍にする」という同じ処理でも、スタイルによって書き方が変わります。手続き型: 処理の手順を上から順に書くconst nums = [1, 2, 3]; const result = []; for (let i = 0; i < nums.length; i++) { result.push(nums[i] * 2); }オブジェクト指向: データと操作をまとめるclass NumberList { constructor(nums) { this.nums = nums; } doubled() { return this.nums.map(n => n * 2); } } const list = new NumberList([1, 2, 3]); list.doubled();関数型: 関数の組み合わせでデータを変換するconst double = x => x * 2; [1, 2, 3].map(double); // [2, 4, 6]関数型は「どうやるか(how)」より「何をしたいか(what)」を宣言的に書ける点が特徴です。実際にはこの3つは排他的ではなく、現代の開発では状況に応じて混ぜて使うのが一般的です。