# 機能設計書 44-単位系（SI）

## 概要

本ドキュメントは、F#コアライブラリにおける国際単位系（SI: International System of Units）の単位型定義機能の設計を記述する。

### 本機能の処理概要

単位系（SI）機能は、F#の計量単位（Units of Measure）機能を活用し、SI基本単位および組立単位を型として定義する。これにより、物理量を含む計算において単位の整合性をコンパイル時に検証できる。

**業務上の目的・背景**：科学技術計算、物理シミュレーション、工学計算などにおいて、単位の不整合は致命的なエラーにつながる。F#の計量単位機能とSI単位定義を組み合わせることで、単位エラーをコンパイル時に検出し、安全な数値計算を実現する。

**機能の利用シーン**：
- 物理学・工学計算における単位付き数値の演算
- 科学シミュレーションプログラムの開発
- 単位変換を伴うデータ処理
- 安全性が重要な計測・制御システム

**主要な処理内容**：
1. SI基本単位（7単位）の[<Measure>]型定義
2. SI組立単位（導出単位）の型定義
3. 単位記号（省略形）のエイリアス定義
4. 単位間の関係性（次元解析）の定義

**関連システム・外部連携**：F#コンパイラの計量単位機能（Units of Measure）

**権限による制御**：特になし（純粋なライブラリ機能）

## 関連画面

本機能はコアライブラリ機能のため、直接関連する画面はない。

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | - |

## 機能種別

型定義 / 計量単位

## 入力仕様

### 入力パラメータ

計量単位は型パラメータとして使用される。

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| 数値 | float<'u> / decimal<'u> 等 | Yes | 単位付き数値 | コンパイル時に単位チェック |

### 入力データソース

プログラムコード内の数値リテラルまたは計算結果

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 計算結果 | float<'u> 等 | 単位付き数値 |

### 出力先

メモリ上の値

## 処理フロー

### 処理シーケンス

```
1. 単位付き数値の定義
   └─ 例: let distance = 5.0<m>
2. 演算の実行
   └─ 加減算: 同一単位のみ許可
   └─ 乗除算: 単位も演算（m * m = m^2）
3. 単位チェック
   └─ コンパイラが型チェックの一部として実行
4. 結果の返却
   └─ 正しい単位を持つ結果値
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[単位付き数値を定義]
    B --> C{演算種別}
    C -->|加減算| D{同一単位?}
    D -->|Yes| E[演算実行]
    D -->|No| F[コンパイルエラー]
    C -->|乗除算| G[単位を計算]
    G --> E
    E --> H[結果を返却]
    H --> I[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 単位整合性 | 加減算は同一単位の値のみ許可 | 加減算時 |
| BR-02 | 次元計算 | 乗除算では単位も演算される | 乗除算時 |
| BR-03 | 無次元化 | 同一単位の除算は無次元値になる | 除算時 |

### 計算ロジック

SI基本単位（7単位）:
| 物理量 | 単位名 | 記号 |
|--------|--------|------|
| 長さ | metre (meter) | m |
| 質量 | kilogram | kg |
| 時間 | second | s |
| 電流 | ampere | A |
| 熱力学温度 | kelvin | K |
| 物質量 | mole | mol |
| 光度 | candela | cd |

SI組立単位（主要なもの）:
| 物理量 | 単位名 | 記号 | 定義 |
|--------|--------|------|------|
| 周波数 | hertz | Hz | 1/s |
| 力 | newton | N | kg*m/s^2 |
| 圧力 | pascal | Pa | N/m^2 |
| エネルギー | joule | J | N*m |
| 電力 | watt | W | J/s |
| 電荷 | coulomb | C | s*A |
| 電圧 | volt | V | W/A |
| 静電容量 | farad | F | C/V |
| 電気抵抗 | ohm | Ω | V/A |
| 電気伝導度 | siemens | S | A/V |
| 磁束 | weber | Wb | V*s |
| 磁束密度 | tesla | T | Wb/m^2 |
| インダクタンス | henry | H | Wb/A |
| 光束 | lumen | lm | cd |
| 照度 | lux | lx | lm/m^2 |
| 放射能 | becquerel | Bq | 1/s |
| 吸収線量 | gray | Gy | J/kg |
| 線量当量 | sievert | Sv | J/kg |
| 触媒活性 | katal | kat | mol/s |

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

本機能はデータベースを使用しない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | コンパイルエラー | 異なる単位間の加減算 | 単位を合わせる |
| - | コンパイルエラー | 期待する単位と異なる単位の値を使用 | 正しい単位の値を使用 |

### リトライ仕様

該当なし（コンパイル時エラー）

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

該当なし

## パフォーマンス要件

- 計量単位はコンパイル時に消去（erased）される
- 実行時のオーバーヘッドはゼロ
- 生成されるILコードは単位なし数値と同一

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

特になし

## 備考

F#の計量単位機能は、型パラメータとして単位を追跡するが、実行時には単位情報は消去される。これはパフォーマンスを維持しつつ、コンパイル時の安全性を提供するための設計。

---

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

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

### 推奨読解順序

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

SI単位の型定義を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | SI.fs | `src/FSharp.Core/SI.fs` | UnitNames名前空間（4-115行目）でSI単位名の定義を把握 |
| 1-2 | SI.fs | `src/FSharp.Core/SI.fs` | UnitSymbols名前空間（117-225行目）で単位記号を確認 |

**読解のコツ**: [<Measure>]属性が付いた型が計量単位として扱われる。型定義の右辺が他の単位との関係を示す。

#### Step 2: 基本単位を理解する

7つのSI基本単位の定義を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | SI.fs | `src/FSharp.Core/SI.fs` | **9-10行目**: metre（長さ） |
| 2-2 | SI.fs | `src/FSharp.Core/SI.fs` | **17-18行目**: kilogram（質量） |
| 2-3 | SI.fs | `src/FSharp.Core/SI.fs` | **21-22行目**: second（時間） |
| 2-4 | SI.fs | `src/FSharp.Core/SI.fs` | **25-26行目**: ampere（電流） |
| 2-5 | SI.fs | `src/FSharp.Core/SI.fs` | **29-30行目**: kelvin（温度） |
| 2-6 | SI.fs | `src/FSharp.Core/SI.fs` | **33-34行目**: mole（物質量） |
| 2-7 | SI.fs | `src/FSharp.Core/SI.fs` | **37-38行目**: candela（光度） |

#### Step 3: 組立単位を理解する

基本単位から導出される組立単位の定義を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | SI.fs | `src/FSharp.Core/SI.fs` | **41-42行目**: hertz = / second（周波数） |
| 3-2 | SI.fs | `src/FSharp.Core/SI.fs` | **45-46行目**: newton = kilogram metre / second^2（力） |
| 3-3 | SI.fs | `src/FSharp.Core/SI.fs` | **49-50行目**: pascal = newton / metre^2（圧力） |
| 3-4 | SI.fs | `src/FSharp.Core/SI.fs` | **53-54行目**: joule = newton metre（エネルギー） |
| 3-5 | SI.fs | `src/FSharp.Core/SI.fs` | **57-58行目**: watt = joule / second（電力） |

**主要処理フロー**:
- 基本単位（metre, kilogram, second等）は単独で定義
- 組立単位は基本単位の組み合わせとして定義（例: newton = kilogram metre / second^2）
- 単位の乗除算は型レベルで自動計算される

#### Step 4: 単位記号を理解する

省略形の単位記号（m, kg, s等）の定義を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | SI.fs | `src/FSharp.Core/SI.fs` | **123-124行目**: m = metre |
| 4-2 | SI.fs | `src/FSharp.Core/SI.fs` | **127-128行目**: kg = kilogram |
| 4-3 | SI.fs | `src/FSharp.Core/SI.fs` | **131-132行目**: s = second |

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

```
[型定義のみ - 実行時の呼び出しなし]

namespace UnitNames
    │
    ├─ 基本単位
    │      ├─ metre (m)
    │      ├─ kilogram (kg)
    │      ├─ second (s)
    │      ├─ ampere (A)
    │      ├─ kelvin (K)
    │      ├─ mole (mol)
    │      └─ candela (cd)
    │
    └─ 組立単位
           ├─ hertz = 1/second
           ├─ newton = kg*m/s^2
           ├─ pascal = N/m^2
           ├─ joule = N*m
           ├─ watt = J/s
           ├─ coulomb = s*A
           ├─ volt = W/A
           ├─ farad = C/V
           ├─ ohm = V/A
           ├─ siemens = A/V
           ├─ weber = V*s
           ├─ tesla = Wb/m^2
           ├─ henry = Wb/A
           ├─ lumen = cd
           ├─ lux = lm/m^2
           ├─ becquerel = 1/s
           ├─ gray = J/kg
           ├─ sievert = J/kg
           └─ katal = mol/s

namespace UnitSymbols
    │
    └─ 上記各単位の短縮名エイリアス
           m, kg, s, A, K, mol, cd,
           Hz, N, Pa, J, W, C, V, F, S, ohm,
           Wb, T, H, lm, lx, Bq, Gy, Sv, kat
```

### データフロー図

```
[コンパイル時]

ソースコード         ───▶  F#コンパイラ        ───▶  型チェック済みIL
  let v = 5.0<m>          (計量単位解析)            float型として出力
    │
    ▼
単位型定義          ───▶  次元解析            ───▶  単位整合性検証
  SI.fs                   (単位の乗除算)            エラーまたは成功

[実行時]

IL実行              ───▶  CLR                ───▶  結果
  float演算                (単位情報なし)          float値
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| SI.fs | `src/FSharp.Core/SI.fs` | ソース | SI単位の型定義 |
| prim-types.fs | `src/FSharp.Core/prim-types.fs` | ソース | [<Measure>]属性の定義 |
