Перейти до вмісту
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

    Використовуйте для промптів на кшталт «простеж, як запит розбирається й перевіряється».