本文へスキップ
cd /languages
  • 純粋関数型
  • プログラミング
  • AST・シンボル対応

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

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

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にはデコレーターの構文がないため、デコレーターの関係性は適用対象外とされています。

次のステップ

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

最適な用途

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

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

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

エンジンの詳細

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

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

  • find_symbol

    定義と参照が必要なときに、関数や型で使ってください。構造的なプリセットはラムダだけを返します。

  • dependency_search

    型クラスに対してincomingのトラバーサルを使い、インスタンスを持つ型を確認してください。

  • get_task_context

    「リクエストがどのようにデコードされ、検証されるかを追跡して」のようなプロンプトに使ってください。