Naar inhoud springen
cd /languages
  • Puur functioneel
  • Programmeren
  • AST- en symboolondersteuning

Haskell in Maguyva: codegrafen voor typeklassen en modules

Maguyva ondersteunt Haskell met AST, symbolen en graaf, zodat AI-agents functies, typeklasse-instances en dataconstructors over modules heen volgen.

Waar Haskell oppervlakkige AI-tools laat struikelen

Haskell roept functies aan zonder haakjes, combineert ze met operatoren en dispatcht via typeklassen. render user is één aanroep, f . g <$> xs bevat er meerdere, en show betekent wat de instance voor dat type zegt. Tekstzoeken vindt de namen, niet de instances erachter.

Maguyva legt instances en constructors vast als relaties, zodat een agent ziet welke types een klasse implementeren en waar een waarde wordt opgebouwd.

Wat Maguyva in Haskell extraheert

Maguyva koppelt .hs- en .lhs-bestanden aan Haskell. Functies en bindings worden als callables geëxtraheerd, en typeklassen, data-types en newtypes als types. Aanroepen worden herkend in applicatie met spaties en via infix-operatoren, en imports normaliseren qualified-, hiding- en as-clausules.

Typeklassen en constructors worden graafrelaties:

  • instance Eq Point legt vast dat Point Eq implementeert.
  • Als een klassemethode in hetzelfde bestand een standaardbody heeft, legt een instance die deze methode definieert een override van die standaard vast.
  • Het toepassen van een dataconstructor, zoals Point 1 2, telt als instantiatie.
  • error, undefined en throw leggen throws vast, en handlers zoals catch leggen catches vast.

Omdat instance-declaraties namen als show of return kunnen definiëren, wordt een definitie in hetzelfde bestand niet automatisch als doel van een aanroep zonder receiver met die naam beschouwd.

Voorbeeldprompts voor agents

  • “Wie roept parseConfig aan, en vanuit welke modules?” (find_symbol, daarna dependency_search incoming)
  • “Welke types hebben een ToJSON-instance?” (dependency_search)
  • “Volg hoe een request wordt gedecodeerd en gevalideerd.” (get_task_context)

Bekende beperkingen

  • Ongeveer 130 namen uit Prelude en base, zoals map, foldr, fmap, pure en >>=, en modules zoals Data.List en Control.Monad, worden uit de relaties gefilterd. Gebruik daarvoor text_pattern_search.
  • In de grammatica staat een ruwe functieknoop ook voor functietypes, dus de preset functions in structural_search geeft alleen lambda’s terug, en de presets methods en variables selecteren niets. Gebruik find_symbol voor benoemde functies.
  • Literate .lhs-bestanden worden in hun geheel met de Haskell-grammatica gelezen, dus reken daar op onvolledige resultaten.
  • Haskell heeft geen decoratorsyntaxis, dus decoratorrelaties zijn als niet van toepassing gemarkeerd.

Volgende stappen

Koppel een repository via de snelstart en bekijk daarna de ondersteuningsmatrix op de compatibiliteitspagina. Lees voor andere functionele codebases de Elixir-gids.

Beste toepassing

  • > Haskell-services en -bibliotheken met veel modules, typeklassen en instances.
  • > Compilers, parsers en andere codebases waarin een wijziging aan één datatype ver doorwerkt.
  • > Teams die AI-agents gebruiken om onbekende Haskell te lezen voor een refactor.

Agentworkflows

  • > Alle aanroepers van een functie vinden voordat de typesignatuur verandert.
  • > Opsommen welke types een instance van een typeklasse hebben.
  • > Volgen waar een dataconstructor wordt opgebouwd en welke functies hem gebruiken.

Enginedetails

  • > Haskell-ondersteuning koppelt `.hs` en `.lhs` aan Haskell. Typeklassen, `data`-types en `newtype`s zijn types, en aanroepen worden herkend in applicatie met spaties en via infix-operatoren.
  • > `instance Eq Point` legt vast dat `Point` `Eq` implementeert, en een instancemethode die een klassestandaard uit hetzelfde bestand vervangt, legt een override vast.
  • > Het toepassen van een dataconstructor telt als instantiatie, en ongeveer 130 namen uit Prelude en base worden uit de relaties gefilterd.

Nuttige MCP-instappunten

  • find_symbol

    Gebruik het voor een functie of type wanneer je de definitie en referenties nodig hebt; structurele presets geven alleen lambda's terug.

  • dependency_search

    Gebruik incoming-traversal op een typeklasse om te zien welke types instances hebben.

  • get_task_context

    Gebruik het voor prompts als "volg hoe een request wordt gedecodeerd en gevalideerd."