関数型プログラミング
副作用を避け、純粋関数と不変データを中心にプログラムを構築するパラダイム
プログラミング基礎
関数型プログラミングとは
関数型プログラミング (FP) は、副作用を避け、純粋関数と不変データを中心にプログラムを構築するパラダイムである。Haskell が純粋関数型言語の代表。TypeScript、Rust、Java も FP の要素を取り入れている。
核となる概念
| 概念 | 説明 |
|---|---|
| 純粋関数 | 同じ入力に対して常に同じ出力、副作用なし |
| 不変性 | データを変更せず、新しいデータを作る |
| 高階関数 | 関数を引数に取る、または関数を返す |
| 関数合成 | 小さな関数を組み合わせて大きな処理を作る |
命令型 vs 関数型
// 命令型: 状態を変更
let total = 0;
for (const item of items) {
if (item.active) total += item.price;
}
// 関数型: データを変換
const total = items
.filter(item => item.active)
.reduce((sum, item) => sum + item.price, 0);
不変性
// ❌ ミュータブル
const user = { name: 'Alice', age: 30 };
user.age = 31; // 元のオブジェクトを変更
// ✅ イミュータブル
const updatedUser = { ...user, age: 31 }; // 新しいオブジェクトを作成
高階関数
// map, filter, reduce は高階関数
const names = users.map(u => u.name);
const adults = users.filter(u => u.age >= 18);
// 関数を返す関数
const multiply = (factor: number) => (x: number) => x * factor;
const double = multiply(2);
double(5); // 10
パイプライン
// 関数を合成してパイプラインを作る
const processOrder = (order: Order) =>
pipe(
validateOrder,
calculateTotal,
applyDiscount,
generateInvoice,
)(order);
Lambda と FP
Lambda 関数は本質的に関数型。入力 (event) を受け取り、出力 (response) を返す純粋関数として設計すると、テストしやすく、冪等性を確保しやすい。
FP のメリット
純粋関数は入出力だけでテストでき、共有状態がないためデータ競合が起きず並行処理に強い。副作用がないので挙動が予測可能で、小さな関数を組み合わせて複雑な処理を構築できる合成のしやすさも利点だ。
実務での活用方法は関連書籍にも詳しい。