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

Canonical source: https://maguyva.ai/pl/languages/haskell

License: text under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/); code samples under [MIT-0](https://opensource.org/license/mit-0); the Maguyva name, logos, brand assets and other code are not covered. Details: [maguyva.ai/license](https://maguyva.ai/license).

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.

## Migawka wsparcia

- Poziom: Obsługa AST i symboli
- Programowanie
- Rozszerzenia: .hs, .lhs
- Prawdziwe parsowanie AST dla wyszukiwania świadomego składni i kontekstu strukturalnego.
- Nazwane symbole zasilają wyszukiwanie semantyczne i wzajemne odwołania. Nawigacja po grafie jest dostępna po włączeniu ekstrakcji relacji.
- Ten język dostarcza symbole i relacje do wyszukiwania uwzględniającego graf; obsługiwane typy krawędzi zależą od jego rodzimych konstrukcji.
- Dostępne są zarówno parsowanie AST, jak i ekstrakcja symboli.

## 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ą.

## 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](/pl/docs/quickstart), a potem sprawdź macierz obsługi na [stronie zgodności](/pl/docs/compatibility). W przypadku innych funkcyjnych baz kodu przeczytaj [przewodnik po Elixirze](/pl/languages/elixir).

## 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”.
