#0144（2025/05/21）関数プログラミングとは

# 関数プログラミング徹底ガイド


## 1. 概要

関数プログラミング（Functional Programming, **FP**）は、**副作用のない純粋関数を合成してプログラムを構築する**という発想に基づくパラダイムです。1970年代のラムダ計算・型理論の研究をルーツとし、近年はクラウドスケールの分散処理や UI ライブラリ（React など）の台頭で再注目されています。本ガイドでは、**基礎理論 → 実装テクニック → 実務応用 → 導入戦略** の 4 階層で FP を体系的に解説します。


---

## 2. 基本原則（Core Principles）

FP の中核を成す 6 つの柱を、**概念 → キーワード → 実装ポイント** の三段構成で整理します。

| 原則       | 核心キーワード           | 実装ポイント                   | 代表ライブラリ / 機能                                      |                                
| -------- | ----------------- | ------------------------ | ------------------------------------------------- | 
| **純粋関数** | *Pure Function*   | ① 同一入力は同一出力 ② 外部状態を変更しない | `map`, `filter`（JS/Python）、`defn`（Clojure）        |                                |
| **不変性**  | *Immutability*    | データを「変更」ではなく「写像」で扱う      | `Immutable.js`, `pyrsistent`, `case class`（Scala） |                                |
| **高階関数** | *Higher‑Order*    | 関数を値として授受する              | `Stream` API（Java/Kotlin）、`lambda`（Python）        |                                |
| **関数合成** | *Composition*     | ⓐ 前置（`∘`）ⓑ パイプライン 抽象化                                          | `compose`（Ramda）、Elixir パイプ演算子 |
| **遅延評価** | *Lazy Evaluation* | 計算を必要時まで遅延→メモ化で性能最適化     | `lazy` キーワード（Kotlin）、`generator` (Python)         |                                |
| **モナド**  | *Monad*           | エフェクトを「箱」に閉じ込め逐次合成       | `IO`/`Maybe`（Haskell）、`Result<T,E>`（Rust）         |                            

> **副作用とは？** ファイル I/O、ネットワーク通信、乱数、時間参照、例外スローなど *外界を観察・変更する* 操作。FP ではビジネスロジックと分離し、テスト可能性を担保します。

---

## 3. 代表言語・ランタイム（Ecosystem Landscape）

### 3.1 純粋関数型（Pure FP）

| 言語             | 特徴                                  | 実務採用例                                     |
| -------------- | ----------------------------------- | ----------------------------------------- |
| **Haskell**    | 強力な型推論・型クラス・ Lazy デフォルト             | FinTech (Standard Chartered)、シミュレーションエンジン |
| **Elm**        | ブラウザ UI 専用、No-runtime-exception を保証 | Frontend SPA、教育                           |
| **PureScript** | Elm + 型レベルプログラミング                   | Web・Node.js フレームワーク「Halogen」              |

### 3.2 マルチパラダイム（Hybrid）

Scala / F# / OCaml / Elixir は OOP と FP を柔軟に切替可能。特に **Scala 3** の Union 型 & Given/Using 構文、**Elixir** の BEAM VM（軽量プロセス＋メッセージパッシング）は「副作用境界」をプラットフォームレベルでサポートしています。

### 3.3 関数型サポート言語

Java (Stream API), JavaScript/TypeScript, Python, C#, Kotlin など。**コレクション API + ラムダ式** で部分的に FP を導入しやすく、レガシー資産と共存可能です。

---

## 4. 主要テクニック & パターン（Pattern Catalog）

### 4.1 map / filter / reduce（データ指向ループ）

```python
# python
from functools import reduce
numbers = range(1, 6)
result = reduce(lambda acc, x: acc + x**2, numbers, 0)  # Σ n^2 = 55
```

💡 **Imperative vs Functional**: `for` ループの副作用 (`acc +=`) を排除し、式として合計を導出。

### 4.2 カリー化 & 部分適用（Composable APIs）

```javascript
// TypeScript
const logLevel = level => message =>
  console.log(`[${level}] ${message}`);
const info = logLevel('INFO');
info('Server started');
```

→ DI (Dependency Injection) を関数合成で実現でき、テスト時にモック関数を差し替えやすい。

### 4.3 関数パイプライン & エラーハンドリング

```haskell
--haskell
import Data.Char (toUpper)
process :: String -> Either String String
process = Right
      >=> ensureNonEmpty  -- Either モナドで失敗伝搬
      >=> Right . map toUpper
```

### 4.4 エフェクトシステム & Algebraic Effects（先端トピック）

* **ZIO (Scala)**: 型安全な非同期 I/O & リソース安全性を提供。
* **Kotlin Arrow Fx**: Structured Concurrency + Effect 型。
* **OCaml Multicore Effects**: Algebraic effect ハンドラで CPS を不要化。

---

## 5. メリット / デメリット（Pros & Cons）

### 5.1 メリット

1. **可読性 & 意図の明確化**: 逐次命令より “データ変換の流れ” を宣言的に記述。
2. **テスト容易**: 純粋関数は Given‑When‑Then が明確。プロパティベーステスト（`hypothesis`, `fast-check`）との相性◎。
3. **並列・並行耐性**: 共有可変状態が無いため、データ競合を言語レベルで防止。
4. **リファクタリング耐性**: 複数の小関数を合成 ≒ Lego ブロック。依存関係が明示的。

### 5.2 デメリット

* **抽象化の壁**: モナド変換子スタックなどは理解コストが高い。
* **パフォーマンスコスト**: 不変データ複製は GC 負荷を増やすが、*永続データ構造*（指針共有）で軽減。
* **デバッグの難しさ**: Call stack が小関数に分割→ IDE デバッガ対応が不十分なことも。

---

## 6. 実務応用シナリオ（Case Studies）

| ドメイン          | スタック                    | FP 的メリット                                | 成果                        |
| ------------- | ----------------------- | --------------------------------------- | ------------------------- |
| **Web UI**    | React + Redux Toolkit   | `reducer` = 純粋関数、`immer` で immutability | UI バグ 30%          |
| **データパイプライン** | Apache Spark (Scala)    | `mapPartitions` による副作用排除                | ETL 処理時間 40% 短縮           |
| **リアルタイム処理**  | Elixir/Phoenix Channels | Actor Model ✕ 不変データ                     | WebSocket チャットで 100k 同時接続 |
| **金融リスク計算**   | F# + FParsec            | 強力な型推論 + パイプ演算子                         | Excel マクロ置換で 保守コスト 1/4    |

---

## 7. 導入戦略（Adoption Roadmap）

1. **Scope 定義**: 既存コードベースから副作用の少ないユーティリティ層を選択。
2. **Incremental FP**: 既存言語のコレクション API で map/filter/reduce を導入→ 成功体験を作る。
3. **Immutable Discipline**: DTO を final class / dataclass 化し、セッターを禁止。
4. **Boundary Pattern**: I/O や DB アクセスを `Gateway` 層に隔離し、内部を純粋関数で保つ。
5. **観測可能性**: ログ出力やトレーシングを *関数デコレータ* で統一。副作用をロギングに閉じ込める。
6. **チーム教育**: FP‐Kata（Bowling Game/Bank Account）をコードカタとして実施。


---

## 8. 先端トピック（Advanced Topics）

1. **Category Theory for Engineers**: Functor, Applicative, Monad の背後にある射影写像。
2. **Optics (Lens/Prism)**: 複雑ネストデータをイミュータブル更新。
3. **Functional Reactive Programming (FRP)**: 時系列データをストリームとして扱う（RxJS、Reactive-banana）。
4. **Effect Systems & Algebraic Effects**: Side effect を型で記述しコンパイル時に検証。
5. **Dependent Types**: Idris / Agda による「値に依存する型」でビジネスルールを型検査。

---

## 9. まとめ & 次の一歩

関数プログラミングは単なる“言語機能”ではなく、**副作用を境界に閉じ込め、データ変換を宣言的に表現する設計哲学**です。小さなユーティリティ関数を純粋化するところから始め、**測定可能なメリット（バグ減少・テスト時間短縮・性能改善）** をチームに示すことが導入成功の鍵となります。

> **Action Checklist**
>
> * [ ] 現行サービスで I/O を伴わないロジックを抽出し、純粋関数として再実装
> * [ ] CI に Property‑Based Test を追加し、入力空間を網羅的に検証
> * [ ] モナド or Result 型を導入し、例外駆動から 戻り値駆動 へ移行
> * [ ] 3 か月後にエラーバグ数・ MTTR を計測し、定量評価