Przejdź do treści
cd /languages
  • Czysto funkcyjny
  • Programowanie
  • Obsługa AST i symboli

Haskell w Maguyva: grafy kodu dla klas typów i modułów

Maguyva obsługuje Haskella przez AST, symbole i graf, dzięki czemu agenci AI śledzą funkcje, instancje klas typów i konstruktory danych między modułami.

Gdzie Haskell sprawia kłopot powierzchownym narzędziom AI

Haskell wywołuje funkcje bez nawiasów, składa je za pomocą operatorów i rozsyła wywołania przez klasy typów. render user to jedno wywołanie, f . g <$> xs zawiera ich kilka, a show znaczy to, co mówi instancja dla danego typu. Wyszukiwanie tekstowe znajduje nazwy, a nie instancje, które za nimi stoją.

Maguyva zapisuje instancje i konstruktory jako relacje, więc agent widzi, które typy implementują klasę i gdzie powstaje wartość.

Co Maguyva wyodrębnia w Haskellu

Maguyva przypisuje pliki .hs i .lhs do Haskella. Funkcje i wiązania są wyodrębniane jako elementy wywoływalne, a klasy typów, typy data i newtype jako typy. Wywołania są rozpoznawane w aplikacji oddzielonej spacjami i przez operatory infiksowe, a importy normalizują klauzule qualified, hiding i as.

Klasy typów i konstruktory stają się relacjami grafu:

  • instance Eq Point zapisuje, że Point implementuje Eq.
  • Gdy metoda klasy ma domyślną treść w tym samym pliku, instancja definiująca tę metodę zapisuje nadpisanie domyślnej implementacji.
  • Zastosowanie konstruktora danych, na przykład Point 1 2, liczy się jako tworzenie instancji.
  • error, undefined i throw zapisują rzucanie wyjątków, a procedury obsługi, takie jak catch, ich przechwytywanie.

Ponieważ deklaracje instancji mogą definiować nazwy takie jak show czy return, definicja z tego samego pliku nie jest z góry uznawana za cel wywołania bez odbiorcy o tej nazwie.

Przykładowe prompty dla agentów

  • „Kto wywołuje parseConfig i z których modułów?” (find_symbol, potem dependency_search incoming)
  • „Które typy mają instancję ToJSON?” (dependency_search)
  • „Prześledź, jak żądanie jest dekodowane i walidowane.” (get_task_context)

Znane ograniczenia

  • Około 130 nazw z Prelude i base, takich jak map, foldr, fmap, pure i >>=, oraz moduły takie jak Data.List i Control.Monad są odfiltrowywane z relacji. Do ich wyszukania użyj text_pattern_search.
  • W gramatyce surowy węzeł funkcji oznacza też typy funkcyjne, więc preset functions w structural_search zwraca tylko lambdy, a presety methods i variables niczego nie wybierają. Dla nazwanych funkcji użyj find_symbol.
  • Pliki Literate Haskell .lhs są czytane w całości gramatyką Haskella, więc licz się z niepełnymi wynikami.
  • Haskell nie ma składni dekoratorów, więc relacje dekoratorów są oznaczone jako nie mające zastosowania.

Kolejne kroki

Podłącz repozytorium za pomocą szybkiego startu, a potem sprawdź macierz obsługi na stronie zgodności. W przypadku innych funkcyjnych baz kodu przeczytaj przewodnik po Elixirze.

Najlepsze dopasowanie

  • > Serwisy i biblioteki w Haskellu z wieloma modułami, klasami typów i instancjami.
  • > Kompilatory, parsery i inne bazy kodu, w których zmiana jednego typu danych sięga daleko.
  • > Zespoły, które używają agentów AI do czytania nieznanego kodu Haskella przed refaktoryzacją.

Workflow agentów

  • > Znaleźć wszystkie miejsca wywołujące funkcję przed zmianą jej sygnatury typu.
  • > Wypisać typy, które mają instancję danej klasy typów.
  • > Prześledzić, gdzie powstaje konstruktor danych i które funkcje go konsumują.

Szczegóły silnika

  • > Obsługa Haskella przypisuje `.hs` i `.lhs` do Haskella. Klasy typów, typy `data` i `newtype` są typami, a wywołania są rozpoznawane w aplikacji przez spacje i przez operatory infiksowe.
  • > `instance Eq Point` zapisuje, że `Point` implementuje `Eq`, a metoda instancji zastępująca domyślną implementację klasy z tego samego pliku zapisuje nadpisanie.
  • > Zastosowanie konstruktora danych liczy się jako tworzenie instancji, a około 130 nazw z Prelude i base jest odfiltrowywanych z relacji.

Przydatne punkty wejścia MCP

  • find_symbol

    Użyj go dla funkcji lub typu, gdy potrzebujesz definicji i odwołań; presety strukturalne zwracają tylko lambdy.

  • dependency_search

    Użyj przejścia incoming na klasie typów, aby zobaczyć, które typy mają instancje.

  • get_task_context

    Użyj go do promptów takich jak „Prześledź, jak żądanie jest dekodowane i walidowane”.