# 機能設計書 31-オプション型（Option）

## 概要

本ドキュメントは、F#コアライブラリにおけるオプション型（Option）およびその操作関数群の機能設計を記述する。Option型は値の有無を型安全に表現するための判別共用体であり、null参照の問題を回避するための重要な機能である。

### 本機能の処理概要

**業務上の目的・背景**：従来のプログラミング言語では、値が存在しない可能性を表現するためにnull参照を使用していたが、これはNullReferenceExceptionの原因となり、多くのバグを生み出してきた。Option型は「値がある（Some）」か「値がない（None）」かを型レベルで明示的に表現することで、コンパイル時に値の有無をチェックでき、より安全なプログラミングを可能にする。また、F#の関数型プログラミングパラダイムにおいて、モナディックな操作（map、bind等）を通じた宣言的なコード記述を支援する。

**機能の利用シーン**：データベースクエリの結果が存在しない可能性がある場合、ユーザー入力の検証で値が無効な場合、辞書やコレクションからの検索で要素が見つからない場合、設定ファイルからのオプション値の読み取り時など、値の存在が保証されないあらゆる場面で使用される。

**主要な処理内容**：
1. 値の有無を判定する関数（isSome、isNone）の提供
2. 値を安全に取り出す関数（get、defaultValue、defaultWith）の提供
3. 関数型プログラミングのためのコンビネータ関数（map、bind、filter、fold）の提供
4. Option型と他の型（Nullable、obj、ValueOption）間の変換関数の提供
5. コレクション操作との互換性を持つ関数（toList、toArray、iter、exists、forall）の提供

**関連システム・外部連携**：.NETのNullable<T>型との相互変換、C#との相互運用性のためのnull参照との変換機能を提供する。ValueOption型（構造体ベース）とも相互変換可能。

**権限による制御**：本機能はライブラリ関数群であり、権限による制御は行わない。

## 関連画面

該当なし（コアライブラリ機能であり、画面は持たない）

## 機能種別

計算処理 / データ変換 / バリデーション

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| option | 'T option | Yes | 操作対象のオプション値 | - |
| value | 'T | No | デフォルト値や比較対象の値 | - |
| mapping | 'T -> 'U | No | 変換関数 | - |
| binder | 'T -> 'U option | No | 束縛関数 | - |
| predicate | 'T -> bool | No | 述語関数 | - |
| folder | 'State -> 'T -> 'State | No | 畳み込み関数 | - |
| action | 'T -> unit | No | 副作用関数 | - |

### 入力データソース

F#プログラム内で生成されるOption型の値、または他の関数からの戻り値として受け取る。

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 結果 | 'T option / 'T / bool / int / 'T list / 'T array | 各関数に応じた戻り値 |

### 出力先

関数の戻り値としてプログラムに返却。

## 処理フロー

### 処理シーケンス

```
1. Option値の受け取り
   └─ パターンマッチングでSome/Noneを判定
2. 各操作に応じた処理実行
   └─ Some(x)の場合: 内部値xに対して処理を適用
   └─ Noneの場合: デフォルト値返却または何もしない
3. 結果の返却
   └─ 新しいOption値、変換後の値、または集約結果
```

### フローチャート

```mermaid
flowchart TD
    A[Option値を受け取る] --> B{Some/None判定}
    B -->|Some x| C[内部値xを取得]
    C --> D[変換/述語/畳み込み等を適用]
    D --> E[結果を返却]
    B -->|None| F[デフォルト動作]
    F --> E
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-31-1 | None伝播 | map、bind、filter等の操作はNoneを保持して伝播する | 入力がNoneの場合 |
| BR-31-2 | get失敗時例外 | get関数はNoneに対して呼び出すとArgumentException | optionがNoneの場合 |
| BR-31-3 | null変換 | ofObj関数はnull参照をNoneに変換する | 入力がnull参照の場合 |

### 計算ロジック

- `count`: Someなら1、Noneなら0を返す
- `fold`: Someの場合のみfolderを適用、Noneの場合は初期状態をそのまま返す

## データベース操作仕様

該当なし（メモリ上のデータ操作のみ）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| ArgumentException | 実行時例外 | NoneにgetまたはValueを呼び出した場合 | defaultValueやdefaultWithを使用する |

### リトライ仕様

該当なし（単純な同期関数のため）

## トランザクション仕様

該当なし（メモリ上の操作のみ）

## パフォーマンス要件

- すべての関数はO(1)の時間計算量
- インライン最適化（inline属性）により関数呼び出しオーバーヘッドを最小化
- InlineIfLambda属性によるラムダ式のインライン化

## セキュリティ考慮事項

特になし（純粋な値変換関数群）

## 備考

- Option型は参照型であるためヒープ割り当てが発生する。パフォーマンスクリティカルな場面ではValueOption型の使用を検討
- F# 4.1以降、Option.ofObjとOption.toObjはnull許容参照型との互換性が強化されている

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

Option型自体は言語組み込みの判別共用体として定義されている。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | prim-types.fsi | `src/FSharp.Core/prim-types.fsi` | Option型のシグネチャ定義（Some/None判別共用体） |

**読解のコツ**: Option型は`type 'T option = None | Some of 'T`という判別共用体。F#の最も基本的な型の一つ。

#### Step 2: エントリーポイントを理解する

Optionモジュールが提供する各関数を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | option.fs | `src/FSharp.Core/option.fs` | Optionモジュールの全関数実装 |

**主要処理フロー**:
1. **10-14行目**: `get`関数 - Noneの場合はArgumentException、Someの場合は値を返す
2. **16-26行目**: `isSome`/`isNone`関数 - パターンマッチングによる存在判定
3. **28-32行目**: `defaultValue`関数 - Noneの場合のデフォルト値提供
4. **34-38行目**: `defaultWith`関数 - 遅延評価版のデフォルト値提供
5. **94-98行目**: `map`関数 - 値がある場合に変換を適用
6. **112-116行目**: `bind`関数 - モナディックな連鎖操作

#### Step 3: ValueOptionモジュールを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | option.fs | `src/FSharp.Core/option.fs` | ValueOptionモジュール（179行目以降） |

**主要処理フロー**:
- **179-354行目**: ValueOption型用の操作関数群（Option型と同様のAPI）

### プログラム呼び出し階層図

```
ユーザーコード
    │
    ├─ Option.map mapping option
    │      └─ パターンマッチ: Some x -> Some (mapping x) | None -> None
    │
    ├─ Option.bind binder option
    │      └─ パターンマッチ: Some x -> binder x | None -> None
    │
    ├─ Option.defaultValue value option
    │      └─ パターンマッチ: Some v -> v | None -> value
    │
    └─ Option.ofNullable nullable
           └─ nullable.HasValue判定 -> Some/None変換
```

### データフロー図

```
[入力]                    [処理]                         [出力]

'T option  ───────▶ パターンマッチング ───────▶ 'U option (map/bind)
                         │
                         ├──▶ Some x: 変換/処理適用
                         │
                         └──▶ None: 伝播/デフォルト

Nullable<'T> ─────▶ HasValue判定 ────────────▶ 'T option (ofNullable)

'T | null ────────▶ null判定 ────────────────▶ 'T option (ofObj)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| option.fs | `src/FSharp.Core/option.fs` | ソース | Option/ValueOptionモジュールの実装 |
| option.fsi | `src/FSharp.Core/option.fsi` | シグネチャ | Option/ValueOptionモジュールのシグネチャ定義 |
| prim-types.fsi | `src/FSharp.Core/prim-types.fsi` | シグネチャ | Option型の定義 |
| prim-types.fs | `src/FSharp.Core/prim-types.fs` | ソース | Option型の実装 |
