# MaguyvaのHaskell対応: 型クラスとモジュールのコードグラフ

Canonical source: https://maguyva.ai/ja/languages/haskell

License: text under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/); code samples under [MIT-0](https://opensource.org/license/mit-0); the Maguyva name, logos, brand assets and other code are not covered. Details: [maguyva.ai/license](https://maguyva.ai/license).

MaguyvaはAST、シンボル、グラフでHaskellに対応しています。AIエージェントはモジュールをまたいで、関数、型クラスのインスタンス、データコンストラクターをたどれます。

## 対応状況スナップショット

- 対応レベル: AST・シンボル対応
- プログラミング
- 拡張子: .hs, .lhs
- 構文を考慮した検索と構造コンテキストのための実際のAST解析。
- 名前付きシンボルはセマンティック検索と相互参照に利用されます。関係抽出が有効な場合は、グラフナビゲーションも利用できます。
- この言語は、グラフを考慮した検索にシンボルと関係情報を提供します。対応するエッジの種類は、その言語固有の構文要素によって異なります。
- AST解析とシンボル抽出の両方に対応しています。

## 最適な用途

- 多くのモジュール、型クラス、インスタンスを持つHaskellのサービスとライブラリ。
- 1つのデータ型の変更が遠くまで波及する、コンパイラー、パーサー、その他のコードベース。
- リファクタリングの前に、AIエージェントを使って見慣れないHaskellを読むチーム。

## エージェントワークフロー

- 関数の型シグネチャを変更する前に、その呼び出し元をすべて見つける。
- ある型クラスのインスタンスを持つ型を一覧にする。
- データコンストラクターがどこで構築され、どの関数がそれを使うかを追跡する。

## Haskellが浅いAIツールをつまずかせるところ

Haskellは括弧なしで関数を呼び出し、演算子で関数を合成し、型クラスを通してディスパッチします。`render user` は1つの呼び出しで、`f . g <$> xs` には複数の呼び出しが含まれ、`show` の意味はその型のインスタンスが決めます。テキスト検索は名前を見つけても、その背後のインスタンスは見つけられません。

Maguyvaはインスタンスとコンストラクターを関係性として記録するため、エージェントはどの型がクラスを実装し、値がどこで構築されるかを確認できます。

## MaguyvaがHaskellで抽出するもの

Maguyvaは `.hs` と `.lhs` ファイルをHaskellに対応付けます。関数と束縛は呼び出し可能なものとして、型クラス、`data` 型、`newtype` は型として抽出されます。呼び出しは空白区切りの関数適用と中置演算子の両方で認識され、インポートは `qualified`、`hiding`、`as` 句を正規化します。

型クラスとコンストラクターは、次のようにグラフの関係性になります。

- `instance Eq Point` は、`Point` が `Eq` を実装していることを記録します。
- クラスのメソッドが同じファイル内にデフォルトの本体を持つ場合、そのメソッドを定義するインスタンスは、デフォルトのオーバーライドとして記録されます。
- `Point 1 2` のようなデータコンストラクターの適用は、インスタンス化として数えられます。
- `error`、`undefined`、`throw` はスローを記録し、`catch` のようなハンドラーはキャッチを記録します。

インスタンス宣言は `show` や `return` のような名前を定義できるため、同じファイル内の定義が、その名前を持つレシーバーなしの呼び出しの対象だとはみなされません。

## エージェントへのプロンプト例

- 「`parseConfig` を呼び出しているのは誰で、どのモジュールからか？」（`find_symbol`、次に `dependency_search` の incoming）
- 「`ToJSON` のインスタンスを持つ型はどれか？」（`dependency_search`）
- 「リクエストがどのようにデコードされ、検証されるかを追跡して。」（`get_task_context`）

## 既知の制限

- `map`、`foldr`、`fmap`、`pure`、`>>=` のような約130個のPreludeと基本ライブラリの名前、そして `Data.List` や `Control.Monad` のようなモジュールは、関係性から除外されます。それらには `text_pattern_search` を使ってください。
- 文法上、生の関数ノードは関数型も表すため、`structural_search` の `functions` プリセットはラムダだけを返し、`methods` と `variables` のプリセットは何も選択しません。名前付きの関数には `find_symbol` を使ってください。
- 文芸的な `.lhs` ファイルは全体がHaskellの文法で読み込まれるため、部分的な結果になることを想定してください。
- Haskellにはデコレーターの構文がないため、デコレーターの関係性は適用対象外とされています。

## 次のステップ

[クイックスタート](/ja/docs/quickstart)でリポジトリを接続し、[互換性ページ](/ja/docs/compatibility)で対応マトリクスを確認してください。ほかの関数型のコードベースについては、[Elixirガイド](/ja/languages/elixir)をご覧ください。

## エンジンの詳細

- Haskellの対応は `.hs` と `.lhs` を対象にします。型クラス、`data` 型、`newtype` は型で、呼び出しは空白による関数適用と中置演算子の両方で認識されます。
- `instance Eq Point` は `Point` が `Eq` を実装していることを記録し、同じファイル内のクラスのデフォルトを置き換えるインスタンスメソッドはオーバーライドを記録します。
- データコンストラクターの適用はインスタンス化として数えられ、約130個のPreludeと基本ライブラリの名前は関係性から除外されます。

## 役立つMCPエントリーポイント

- `find_symbol`: 定義と参照が必要なときに、関数や型で使ってください。構造的なプリセットはラムダだけを返します。
- `dependency_search`: 型クラスに対してincomingのトラバーサルを使い、インスタンスを持つ型を確認してください。
- `get_task_context`: 「リクエストがどのようにデコードされ、検証されるかを追跡して」のようなプロンプトに使ってください。
