Перейти к содержимому
cd /languages
  • Чисто функциональный
  • Программирование
  • Поддержка AST и символов

Haskell в Maguyva: графы кода для классов типов и модулей

Maguyva поддерживает Haskell с AST, символами и графом, чтобы ИИ-агенты могли прослеживать функции, экземпляры классов типов и конструкторы данных между модулями.

Где Haskell сбивает с толку поверхностные ИИ-инструменты

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 по входящим связям)
  • «У каких типов есть экземпляр ToJSON?» (dependency_search)
  • «Проследи, как запрос разбирается и проверяется.» (get_task_context)

Известные ограничения

  • Около 130 имён из Prelude и базовой библиотеки, таких как map, foldr, fmap, pure и >>=, а также модули вроде Data.List и Control.Monad, отфильтрованы из связей. Для них используйте text_pattern_search.
  • В грамматике простой узел функции обозначает и функциональные типы, поэтому пресет functions в structural_search возвращает только лямбды, а пресеты methods и variables ничего не выбирают. Для именованных функций используйте find_symbol.
  • Файлы грамотного программирования .lhs читаются целиком грамматикой Haskell; для них результаты могут быть неполными.
  • В Haskell нет синтаксиса декораторов, поэтому связи декораторов помечены как неприменимые.

Следующие шаги

Подключите репозиторий по быстрому старту, затем изучите матрицу поддержки на странице совместимости. Для других функциональных кодовых баз прочитайте руководство по Elixir.

Лучше всего подходит

  • > Сервисы и библиотеки на Haskell с большим количеством модулей, классов типов и экземпляров.
  • > Компиляторы, парсеры и другие кодовые базы, где изменение одного типа данных расходится далеко.
  • > Команды, которые вместе с ИИ-агентами читают незнакомый код на Haskell перед рефакторингом.

Сценарии работы агента

  • > Найти все вызовы функции, прежде чем менять её сигнатуру типа.
  • > Перечислить типы, у которых есть экземпляр класса типов.
  • > Проследить, где создаётся конструктор данных и какие функции его используют.

Детали движка

  • > Поддержка Haskell сопоставляет файлы `.hs` и `.lhs` с Haskell. Классы типов, типы `data` и типы `newtype` являются типами; вызовы распознаются в применении через пробел и через инфиксные операторы.
  • > `instance Eq Point` фиксирует, что `Point` реализует `Eq`, а метод экземпляра, заменяющий умолчание класса в том же файле, фиксирует переопределение.
  • > Применение конструктора данных считается созданием экземпляра; около 130 имён из Prelude и базовой библиотеки отфильтрованы из связей.

Полезные точки входа MCP

  • find_symbol

    Используйте для функции или типа, когда нужны определение и ссылки; структурные пресеты возвращают только лямбды.

  • dependency_search

    Используйте обход входящих связей для класса типов, чтобы увидеть, у каких типов есть экземпляры.

  • get_task_context

    Используйте для промптов вроде «проследи, как запрос разбирается и проверяется».