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

Canonical source: https://maguyva.ai/ru/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 поддерживает Haskell с AST, символами и графом, чтобы ИИ-агенты могли прослеживать функции, экземпляры классов типов и конструкторы данных между модулями.

## Сводка поддержки

- Уровень: Поддержка AST и символов
- Программирование
- Расширения: .hs, .lhs
- Настоящий AST-разбор для синтаксически осведомлённого поиска и структурного контекста.
- Именованные символы обеспечивают семантический поиск и перекрёстные ссылки. Навигация по графу доступна, когда включено извлечение связей.
- Этот язык добавляет символы и связи в поиск с учётом графа; поддерживаемые типы рёбер зависят от присущих ему конструкций.
- Доступны и AST-разбор, и извлечение символов.

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

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

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

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

## Где 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 нет синтаксиса декораторов, поэтому связи декораторов помечены как неприменимые.

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

Подключите репозиторий по [быстрому старту](/ru/docs/quickstart), затем изучите матрицу поддержки на [странице совместимости](/ru/docs/compatibility). Для других функциональных кодовых баз прочитайте [руководство по Elixir](/ru/languages/elixir).

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

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

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

- `find_symbol`: Используйте для функции или типа, когда нужны определение и ссылки; структурные пресеты возвращают только лямбды.
- `dependency_search`: Используйте обход входящих связей для класса типов, чтобы увидеть, у каких типов есть экземпляры.
- `get_task_context`: Используйте для промптов вроде «проследи, как запрос разбирается и проверяется».
