# Maguyva 的 Haskell 支援：面向型別類別與模組的程式碼圖譜

Canonical source: https://maguyva.ai/zh-hant/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 服務與函式庫。
- 改動一個資料型別就會波及遠處的編譯器、解析器和其他程式碼庫。
- 在重構前用 AI 代理閱讀陌生 Haskell 程式碼的團隊。

## 代理工作流程

- 在修改函式的型別簽章之前，找到它的所有呼叫端。
- 列出擁有某個型別類別實例的型別。
- 追蹤某個資料建構子在哪裡被建構，以及哪些函式使用它。

## Haskell 讓淺層 AI 工具栽跟頭的地方

Haskell 呼叫函式不需要括號，用運算子組合函式，並透過型別類別分派。`render user` 是一次呼叫，`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`）

## 已知限制

- 約 130 個 Prelude 和基礎函式庫名稱（如 `map`、`foldr`、`fmap`、`pure` 和 `>>=`），以及 `Data.List`、`Control.Monad` 等模組，會從關係中過濾掉。查詢它們請使用 `text_pattern_search`。
- 在語法中，原始的函式節點也表示函式型別，所以 `structural_search` 中的 `functions` 預設集只回傳 lambda，`methods` 和 `variables` 預設集什麼也選不到。具名函式請使用 `find_symbol`。
- 文學式 `.lhs` 檔案會整體按 Haskell 語法讀取，因此結果可能不完整。
- Haskell 沒有裝飾器語法，因此裝飾器關係被標記為不適用。

## 下一步

透過[快速入門](/zh-hant/docs/quickstart)連接儲存庫，然後在[相容性頁面](/zh-hant/docs/compatibility)檢視支援矩陣。其他函式式程式碼庫請閱讀 [Elixir 指南](/zh-hant/languages/elixir)。

## 引擎細節

- Haskell 支援把 `.hs` 和 `.lhs` 對應為 Haskell。型別類別、`data` 型別和 `newtype` 都是型別，以空格進行的函式應用和中綴運算子中的呼叫都能被識別。
- `instance Eq Point` 記錄 `Point` 實作了 `Eq`，替換同一檔案中類別預設實作的實例方法會記錄覆寫。
- 資料建構子的應用計為實例化，約 130 個 Prelude 和基礎函式庫名稱會從關係中過濾掉。

## 實用的 MCP 進入點

- `find_symbol`: 需要函式或型別的定義和參照時使用它；結構化預設集只回傳 lambda。
- `dependency_search`: 對型別類別使用 incoming 方向走訪，檢視哪些型別擁有實例。
- `get_task_context`: 用於「追蹤一個請求如何被解碼和驗證」這類提示。
