関数型プログラミング(Functional Programming)入門 ― JavaScript初心者のためのやさしい導き
こんにちは。ゆうせいです。
JavaScriptの学習を進めていると、ある日耳にするキーワードがあります。
「関数型プログラミング(Functional Programming)」
「オブジェクト指向とは違うの?」「難しそう…」「何が“関数型”なの?」と思っていませんか?
でも、安心してください。JavaScriptは関数型の考え方を自然に取り入れられる言語です。
今回は、関数型プログラミングの考え方・特徴・JavaScriptでの実践法について、初心者の方にもわかりやすく解説していきます!
そもそも「関数型プログラミング」とは?
関数を“第一級の値”として扱い、状態を持たずに関数の合成でロジックを組み立てるスタイルのプログラミング
つまり、
- 関数はデータの加工装置
- 状態(変数の変更)に依存せず、入力と出力の関係だけで考える
- 副作用を避けて、同じ入力には常に同じ結果を返す
という考え方です。
関数型の“関数”は、ただの関数ではない!
関数型プログラミングにおける「関数」は、“数学的な関数”に近いものです。
f(x) = x * 2
このように、入力が決まれば出力も常に同じであることが重要です。
関数型の特徴(JavaScriptとの対応)
特徴 | 説明 | JavaScriptでの例 |
---|---|---|
純粋関数(Pure Function) | 同じ入力 → 必ず同じ出力、かつ副作用なし | x => x + 1 |
副作用なし | 変数を変えたり、外の値を書き換えたりしない | console.log() すら副作用とされる |
不変性(Immutability) | データを変更せずコピーして使う | map , filter など |
高階関数 | 関数を引数や戻り値にできる | map(fn) や return () => ... |
関数合成 | 関数を組み合わせて処理を作る | compose(f, g) など |
実例で学ぶ関数型の考え方
✅ 純粋関数の例
function square(x) {
return x * x;
}
これは「入力→出力が固定で、外部の影響がない」ので純粋関数です。
❌ 純粋でない関数の例(副作用あり)
let count = 0;
function increment() {
count++;
return count;
}
この関数は外部の変数(count)に依存して値を変更しているので、関数型ではNGとされます。
✅ mapで配列を変換(不変性の実現)
const nums = [1, 2, 3];
const doubled = nums.map(x => x * 2);
console.log(doubled); // [2, 4, 6]
console.log(nums); // [1, 2, 3](元の配列は変わっていない!)
mapは関数型の代表的な操作です!
よく使う関数型メソッド(配列)
メソッド | 用途 | 例 |
---|---|---|
map() | 要素を変換する | [1,2,3].map(x => x * 2) |
filter() | 条件に合う要素だけ残す | [1,2,3].filter(x => x > 1) |
reduce() | 値を1つにまとめる | [1,2,3].reduce((a,b) => a+b) |
forEach() | 副作用がある処理 | [1,2,3].forEach(console.log) |
関数合成(compose)の考え方
const add = x => x + 2;
const multiply = x => x * 3;
const compose = (f, g) => x => f(g(x));
const result = compose(add, multiply)(4); // → add(multiply(4)) = add(12) = 14
これが関数合成(関数のつなぎあわせ)です。
関数型は副作用を避ける
副作用の例:
console.log()
- DOMを操作する
- 外部APIを呼び出す
- ファイルを保存する
これらは「現実世界とのやりとり」で必要ですが、**本質的には関数型では“最後にまとめて行うべきもの”**と考えます。
JavaScriptは“部分的に”関数型
JavaScriptは「完全な関数型言語」ではありませんが、
- 高階関数
- クロージャ
- 不変操作(
map
,filter
,spread
など) - ラムダ式(アロー関数)
など、関数型的な考えを自然に取り入れられる設計になっています。
まとめ:関数型プログラミングとは何か?
ポイント | 内容 |
---|---|
基本の考え | 関数で全てを組み立て、副作用を排除する |
重要な特徴 | 純粋関数、高階関数、不変性、関数合成 |
メリット | テストしやすい・再利用しやすい・バグが減る |
JavaScriptとの相性 | 非常に良い!(部分的に導入しやすい) |
今後の学習のヒント
関数型プログラミングに興味が出てきたら、次のテーマにも挑戦してみましょう!
- カリー化(Currying)と関数の分割
- 部分適用(Partial Application)
- イミュータブルデータ(Immutable.jsやImmer)
- 関数型ライブラリ(Ramda, Lodash/fp)
- 副作用を制御する考え(例:Reactの
useEffect
)
「どうやって変えるか」ではなく「どうやって変えずに目的を達成するか」を考える―それが関数型の美しさです!
ぜひ、あなたのJavaScriptに少しずつ取り入れてみてください!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
