Zum Inhalt springen
cd /languages
  • Rein funktional
  • Programmierung
  • AST- und Symbol-Support

Haskell in Maguyva: Code-Graphen für Typklassen und Module

Maguyva unterstützt Haskell mit AST, Symbolen und Graph, damit KI-Agenten Funktionen, Typklasseninstanzen und Datenkonstruktoren über Module hinweg verfolgen.

Wo Haskell oberflächliche KI-Tools ins Stolpern bringt

Haskell ruft Funktionen ohne Klammern auf, komponiert sie mit Operatoren und dispatcht über Typklassen. render user ist ein Aufruf, f . g <$> xs enthält mehrere, und show bedeutet, was die Instanz für diesen Typ festlegt. Eine Textsuche findet die Namen, nicht die Instanzen dahinter.

Maguyva erfasst Instanzen und Konstruktoren als Beziehungen, damit ein Agent sieht, welche Typen eine Klasse implementieren und wo ein Wert erzeugt wird.

Was Maguyva in Haskell extrahiert

Maguyva ordnet .hs- und .lhs-Dateien Haskell zu. Funktionen und Bindungen werden als Callables extrahiert, Typklassen, data-Typen und newtypes als Typen. Aufrufe werden in leerzeichengetrennter Applikation und über Infix-Operatoren erkannt, und Importe normalisieren qualified-, hiding- und as-Klauseln.

Typklassen und Konstruktoren werden zu Graphbeziehungen:

  • instance Eq Point erfasst, dass Point Eq implementiert.
  • Hat eine Klassenmethode in derselben Datei einen Default-Rumpf, erfasst eine Instanz, die diese Methode definiert, ein Override des Defaults.
  • Die Anwendung eines Datenkonstruktors wie Point 1 2 zählt als Instanziierung.
  • error, undefined und throw erfassen Throws, Handler wie catch erfassen Catches.

Weil Instanzdeklarationen Namen wie show oder return definieren können, wird eine Definition in derselben Datei nicht automatisch als Ziel eines gleichnamigen Aufrufs ohne Receiver angenommen.

Beispiel-Prompts für Agenten

  • „Wer ruft parseConfig auf, und aus welchen Modulen?“ (find_symbol, dann dependency_search incoming)
  • „Welche Typen haben eine ToJSON-Instanz?“ (dependency_search)
  • „Verfolge, wie ein Request dekodiert und validiert wird.“ (get_task_context)

Bekannte Grenzen

  • Etwa 130 Namen aus Prelude und base, etwa map, foldr, fmap, pure und >>=, sowie Module wie Data.List und Control.Monad werden aus den Beziehungen gefiltert. Verwende dafür text_pattern_search.
  • In der Grammatik bezeichnet ein roher Funktionsknoten auch Funktionstypen. Deshalb liefert das Preset functions in structural_search nur Lambdas, und die Presets methods und variables wählen nichts aus. Verwende find_symbol für benannte Funktionen.
  • Literate-Dateien (.lhs) werden als Ganzes mit der Haskell-Grammatik gelesen, rechne dort also mit unvollständigen Ergebnissen.
  • Haskell hat keine Decorator-Syntax, daher sind Decorator-Beziehungen als nicht anwendbar markiert.

Nächste Schritte

Verbinde ein Repository über den Schnellstart und prüfe dann die Unterstützungsmatrix auf der Kompatibilitätsseite. Für andere funktionale Codebasen lies den Elixir-Leitfaden.

Am besten geeignet

  • > Haskell-Services und -Bibliotheken mit vielen Modulen, Typklassen und Instanzen.
  • > Compiler, Parser und andere Codebasen, in denen die Änderung eines Datentyps weit reicht.
  • > Teams, die mit KI-Agenten unbekannten Haskell-Code vor einem Refactoring lesen.

Agentenabläufe

  • > Alle Aufrufer einer Funktion finden, bevor sich ihre Typsignatur ändert.
  • > Auflisten, welche Typen eine Instanz einer Typklasse haben.
  • > Verfolgen, wo ein Datenkonstruktor erzeugt wird und welche Funktionen ihn verarbeiten.

Engine-Einordnung

  • > Die Haskell-Unterstützung ordnet `.hs` und `.lhs` Haskell zu. Typklassen, `data`-Typen und `newtype`s sind Typen, und Aufrufe werden in Leerzeichen-Applikation und über Infix-Operatoren erkannt.
  • > `instance Eq Point` erfasst, dass `Point` `Eq` implementiert, und eine Instanzmethode, die einen Klassen-Default aus derselben Datei ersetzt, erfasst ein Override.
  • > Die Anwendung eines Datenkonstruktors zählt als Instanziierung, und etwa 130 Namen aus Prelude und base werden aus den Beziehungen gefiltert.

Nützliche MCP-Einstiegspunkte

  • find_symbol

    Nutz es für eine Funktion oder einen Typ, wenn du Definition und Referenzen brauchst; strukturelle Presets liefern nur Lambdas.

  • dependency_search

    Nutz die eingehende Traversierung auf einer Typklasse, um zu sehen, welche Typen Instanzen haben.

  • get_task_context

    Nutz es für Prompts wie „verfolge, wie ein Request dekodiert und validiert wird“.