Passer au contenu
cd /languages
  • Fonctionnel pur
  • Programmation
  • Prise en charge de l’AST et des symboles

Haskell dans Maguyva : des graphes de code pour classes de types et modules

Maguyva prend en charge Haskell avec AST, symboles et graphe, pour que les agents IA suivent fonctions, instances de classes de types et constructeurs de données entre modules.

Là où Haskell fait trébucher les outils d’IA superficiels

Haskell appelle les fonctions sans parenthèses, les compose avec des opérateurs et répartit les appels via les classes de types. render user est un appel, f . g <$> xs en contient plusieurs, et show signifie ce que dit l’instance de ce type. Une recherche textuelle trouve les noms, pas les instances qui se cachent derrière.

Maguyva enregistre instances et constructeurs comme des relations : l’agent voit quels types implémentent une classe et où une valeur est construite.

Ce que Maguyva extrait en Haskell

Maguyva associe les fichiers .hs et .lhs à Haskell. Les fonctions et liaisons sont extraites comme appelables, et les classes de types, les types data et les newtype comme types. Les appels sont reconnus dans l’application séparée par des espaces et à travers les opérateurs infixes, et les imports normalisent les clauses qualified, hiding et as.

Les classes de types et les constructeurs deviennent des relations du graphe :

  • instance Eq Point enregistre que Point implémente Eq.
  • Quand une méthode de classe a un corps par défaut dans le même fichier, une instance qui définit cette méthode enregistre une redéfinition de l’implémentation par défaut.
  • L’application d’un constructeur de données, comme Point 1 2, compte comme une instanciation.
  • error, undefined et throw enregistrent des throws, et les handlers comme catch enregistrent des catches.

Comme les déclarations d’instance peuvent définir des noms comme show ou return, une définition du même fichier n’est pas considérée d’office comme la cible d’un appel sans receveur portant ce nom.

Exemples de prompts pour agents

  • « Qui appelle parseConfig, et depuis quels modules ? » (find_symbol, puis dependency_search en incoming)
  • « Quels types ont une instance ToJSON ? » (dependency_search)
  • « Retrace comment une requête est décodée et validée. » (get_task_context)

Limites connues

  • Environ 130 noms du Prelude et de base, comme map, foldr, fmap, pure et >>=, ainsi que des modules comme Data.List et Control.Monad, sont filtrés des relations. Utilisez text_pattern_search pour les retrouver.
  • Dans la grammaire, un nœud de fonction brut désigne aussi les types de fonction : le preset functions de structural_search ne renvoie donc que des lambdas, et les presets methods et variables ne sélectionnent rien. Utilisez find_symbol pour les fonctions nommées.
  • Les fichiers Haskell lettrés .lhs sont lus en entier avec la grammaire Haskell : attendez-vous à des résultats partiels.
  • Haskell n’a pas de syntaxe de décorateur : les relations de décorateur sont donc marquées comme non applicables.

Étapes suivantes

Connectez un dépôt avec le démarrage rapide, puis consultez la matrice de prise en charge sur la page de compatibilité. Pour d’autres bases de code fonctionnelles, lisez le guide Elixir.

Idéal pour

  • > Les services et bibliothèques Haskell comptant de nombreux modules, classes de types et instances.
  • > Les compilateurs, parseurs et autres bases de code où modifier un type de données a des effets lointains.
  • > Les équipes qui utilisent des agents IA pour lire du Haskell inconnu avant un refactoring.

Workflows d'agent

  • > Trouver tous les appelants d'une fonction avant de modifier sa signature de type.
  • > Lister les types qui ont une instance d'une classe de types.
  • > Retracer où un constructeur de données est construit et quelles fonctions le consomment.

Détails du moteur

  • > La prise en charge de Haskell associe `.hs` et `.lhs` à Haskell. Classes de types, types `data` et `newtype` sont des types, et les appels sont reconnus dans l'application par espaces et à travers les opérateurs infixes.
  • > `instance Eq Point` enregistre que `Point` implémente `Eq`, et une méthode d'instance qui remplace un défaut de classe du même fichier enregistre un override.
  • > L'application d'un constructeur de données compte comme instanciation, et environ 130 noms du Prelude et de base sont filtrés des relations.

Points d'entrée MCP utiles

  • find_symbol

    Utilisez-le pour une fonction ou un type quand vous avez besoin de la définition et des références ; les presets structurels ne renvoient que des lambdas.

  • dependency_search

    Utilisez la traversée incoming sur une classe de types pour voir quels types en ont une instance.

  • get_task_context

    Utilisez-le pour des prompts comme « retrace comment une requête est décodée et validée ».