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

Canonical source: https://maguyva.ai/uk/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 немає синтаксису декораторів, тому зв'язки декораторів позначено як незастосовні.

## Наступні кроки

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

## Деталі рушія

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

## Корисні точки входу MCP

- `find_symbol`: Використовуйте для функції чи типу, коли потрібні визначення й посилання; структурні пресети повертають лише лямбди.
- `dependency_search`: Використовуйте обхід вхідних зв'язків для класу типів, щоб побачити, які типи мають екземпляри.
- `get_task_context`: Використовуйте для промптів на кшталт «простеж, як запит розбирається й перевіряється».
