# 機能設計書 51-Haskell

## 概要

本ドキュメントは、space-vimにおけるHaskell言語サポート機能の設計を定義する。haskell-vimプラグインを利用したHaskellファイルの構文ハイライト強化と開発支援機能を提供する。

### 本機能の処理概要

Haskell言語でのVim開発体験を向上させるため、構文ハイライトの拡張とHaskell固有の記法サポートを提供する機能である。

**業務上の目的・背景**：Haskellは関数型プログラミング言語として、型クラス、パターンマッチング、モナド等の独自の概念を持つ。標準のVim構文ハイライトではこれらの要素が十分に強調されないため、専用のプラグインを利用してコードの可読性と開発効率を向上させる必要がある。

**機能の利用シーン**：Haskellプロジェクトの開発時、`.hs`ファイルや`.lhs`（文芸的Haskell）ファイルを編集する際に自動的に有効化される。関数定義、型シグネチャ、パターンマッチングなどの要素が視覚的に区別され、コード理解が容易になる。

**主要な処理内容**：
1. `forall`キーワードの構文ハイライト（量化子）
2. `mdo`と`rec`キーワードの構文ハイライト（再帰的do記法）
3. `proc`キーワードの構文ハイライト（Arrow構文）
4. `pattern`キーワードの構文ハイライト（パターンシノニム）
5. 型役割（type roles）の構文ハイライト
6. `static`キーワードの構文ハイライト（静的ポインタ）
7. Backpackキーワードの構文ハイライト

**関連システム・外部連携**：neovimhaskell/haskell-vimプラグインと連携。deopleteやLSP（coc.nvim等）と組み合わせることで補完機能も利用可能。

**権限による制御**：特になし。レイヤー有効化によりすべての機能が利用可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | Vimエディタ画面 | 主画面 | Haskellファイル編集時の構文ハイライト表示 |

## 機能種別

構文解析 / 構文ハイライト / 言語サポート

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| g:haskell_enable_quantification | Number | No | forallハイライトの有効化 | 0または1 |
| g:haskell_enable_recursivedo | Number | No | mdo/recハイライトの有効化 | 0または1 |
| g:haskell_enable_arrowsyntax | Number | No | procハイライトの有効化 | 0または1 |
| g:haskell_enable_pattern_synonyms | Number | No | patternハイライトの有効化 | 0または1 |
| g:haskell_enable_typeroles | Number | No | 型役割ハイライトの有効化 | 0または1 |
| g:haskell_enable_static_pointers | Number | No | staticハイライトの有効化 | 0または1 |
| g:haskell_backpack | Number | No | Backpackハイライトの有効化 | 0または1 |

### 入力データソース

- Haskellソースファイル（.hs, .lhs）のバッファ内容
- Vim設定変数（g:haskell_*）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 構文ハイライト | 視覚表示 | Haskell固有キーワードのカラー表示 |

### 出力先

- Vimエディタ画面（バッファ表示）

## 処理フロー

### 処理シーケンス

```
1. レイヤー読み込み
   └─ +lang/haskellレイヤーが有効化される
2. プラグイン読み込み
   └─ haskell-vimプラグインがvim-plugにより読み込まれる
3. 設定適用
   └─ config.vimの設定変数が適用される
4. ファイル検出
   └─ .hs/.lhsファイルオープン時にfiletypeがhaskellに設定される
5. 構文ハイライト適用
   └─ haskell-vimの構文定義に基づきハイライトが適用される
```

### フローチャート

```mermaid
flowchart TD
    A[Vim起動] --> B{haskellレイヤー有効?}
    B -->|Yes| C[haskell-vimプラグイン読み込み]
    B -->|No| Z[終了]
    C --> D[設定変数適用]
    D --> E{.hs/.lhsファイルを開く?}
    E -->|Yes| F[filetype=haskell設定]
    E -->|No| G[待機]
    G --> E
    F --> H[構文ハイライト適用]
    H --> I[編集可能状態]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-51-01 | レイヤー依存 | +lang/haskellレイヤーの有効化が必要 | .spacevimファイルでレイヤー指定時 |
| BR-51-02 | ファイルタイプ検出 | .hs, .lhsファイルで自動有効化 | ファイルオープン時 |

### 計算ロジック

特になし（構文ハイライトのみの機能）

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

### 操作別データベース影響一覧

該当なし（データベース操作を行わない）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | プラグイン未インストール | vim-plugによるインストール未完了 | :PlugInstall実行 |

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

- 大規模Haskellファイル（数千行）でも構文ハイライトが遅延なく適用されること
- ファイルオープン時のレイテンシ：100ms以下

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

- 外部通信なし
- ローカルファイルの読み取りのみ

## 備考

- GHC拡張機能を多用するプロジェクトでは、すべての設定変数を1に設定することを推奨
- LSP連携によりより高度な補完・診断機能が利用可能

---

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

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

### 推奨読解順序

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

Haskellレイヤーは設定変数のみで構成されており、複雑なデータ構造は持たない。グローバル変数として各ハイライト機能の有効/無効フラグが定義される。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | config.vim | `layers/+lang/haskell/config.vim` | 7つの設定変数（g:haskell_enable_*）の定義を確認 |

**読解のコツ**: Vim scriptのletコマンドによるグローバル変数定義。`g:`プレフィックスはグローバルスコープを示す。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | packages.vim | `layers/+lang/haskell/packages.vim` | MPマクロによるプラグイン登録を確認 |

**主要処理フロー**:
1. **1行目**: `MP 'neovimhaskell/haskell-vim'` - haskell-vimプラグインをvim-plugに登録

#### Step 3: 設定ファイルを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config.vim | `layers/+lang/haskell/config.vim` | 各設定変数の役割と初期値を確認 |

**主要処理フロー**:
- **1行目**: `g:haskell_enable_quantification = 1` - forallキーワードハイライト有効化
- **2行目**: `g:haskell_enable_recursivedo = 1` - mdo/recキーワードハイライト有効化
- **3行目**: `g:haskell_enable_arrowsyntax = 1` - procキーワードハイライト有効化
- **4行目**: `g:haskell_enable_pattern_synonyms = 1` - patternキーワードハイライト有効化
- **5行目**: `g:haskell_enable_typeroles = 1` - 型役割ハイライト有効化
- **6行目**: `g:haskell_enable_static_pointers = 1` - staticキーワードハイライト有効化
- **7行目**: `g:haskell_backpack = 1` - Backpackキーワードハイライト有効化

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

```
.spacevim (ユーザー設定)
    │
    └─ Layer '+lang/haskell' 有効化
           │
           ├─ packages.vim
           │      └─ MP 'neovimhaskell/haskell-vim' (プラグイン登録)
           │
           └─ config.vim
                  └─ g:haskell_enable_* 変数設定
```

### データフロー図

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

.spacevim ───▶ レイヤーシステム ───▶ プラグイン登録
                     │
                     ▼
              config.vim読み込み
                     │
                     ▼
.hs/.lhsファイル ───▶ haskell-vim ───▶ 構文ハイライト表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+lang/haskell/packages.vim` | 設定 | haskell-vimプラグインの登録 |
| config.vim | `layers/+lang/haskell/config.vim` | 設定 | 構文ハイライト設定変数の定義 |
| LAYERS.md | `layers/LAYERS.md` | ドキュメント | レイヤー一覧とプラグイン情報 |
