跳至主要內容
cd /languages
  • 純函式式
  • 程式語言
  • AST 與符號支援

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

Maguyva 以 AST、符號和圖譜支援 Haskell,讓 AI 代理跨模組追蹤函式、型別類別實例和資料建構子。

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 沒有裝飾器語法,因此裝飾器關係被標記為不適用。

下一步

透過快速入門連接儲存庫,然後在相容性頁面檢視支援矩陣。其他函式式程式碼庫請閱讀 Elixir 指南。

最適合的情境

  • > 擁有大量模組、型別類別和實例的 Haskell 服務與函式庫。
  • > 改動一個資料型別就會波及遠處的編譯器、解析器和其他程式碼庫。
  • > 在重構前用 AI 代理閱讀陌生 Haskell 程式碼的團隊。

代理工作流程

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

引擎細節

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

實用的 MCP 進入點

  • find_symbol

    需要函式或型別的定義和參照時使用它;結構化預設集只回傳 lambda。

  • dependency_search

    對型別類別使用 incoming 方向走訪,檢視哪些型別擁有實例。

  • get_task_context

    用於「追蹤一個請求如何被解碼和驗證」這類提示。