跳转到内容
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

    用于“追踪一个请求如何被解码和校验”这类提示词。