# Haskell in Maguyva: grafi del codice per type class e moduli

Canonical source: https://maguyva.ai/it/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 supporta Haskell con AST, simboli e grafo, così gli agenti IA seguono funzioni, istanze di type class e costruttori di dati tra i moduli.

## Istantanea del supporto

- Livello: Supporto AST e simboli
- Programmazione
- Estensioni: .hs, .lhs
- Analisi AST reale per ricerca sintattica e contesto strutturale.
- I simboli nominati alimentano la ricerca semantica e i riferimenti incrociati. La navigazione del grafo è disponibile quando è abilitata l’estrazione delle relazioni.
- Questo linguaggio contribuisce con simboli e relazioni alla ricerca basata sul grafo; i tipi di arco supportati variano in base ai suoi costrutti nativi.
- Sono disponibili sia l’analisi AST sia l’estrazione dei simboli.

## Il più adatto per

- Servizi e librerie Haskell con molti moduli, type class e istanze.
- Compilatori, parser e altre basi di codice in cui cambiare un tipo di dati ha effetti lontani.
- Team che usano agenti IA per leggere codice Haskell sconosciuto prima di un refactoring.

## Workflow degli agenti

- Trovare tutti i chiamanti di una funzione prima di cambiarne la firma di tipo.
- Elencare quali tipi hanno un'istanza di una type class.
- Tracciare dove viene costruito un costruttore di dati e quali funzioni lo consumano.

## Dove Haskell fa inciampare gli strumenti di IA superficiali

Haskell chiama le funzioni senza parentesi, le compone con gli operatori e fa dispatch tramite le type class. `render user` è una chiamata, `f . g <$> xs` ne contiene diverse, e `show` significa ciò che dice l'istanza per quel tipo. Una ricerca testuale trova i nomi, non le istanze che ci sono dietro.

Maguyva registra istanze e costruttori come relazioni, così un agente vede quali tipi implementano una classe e dove viene costruito un valore.

## Cosa estrae Maguyva in Haskell

Maguyva associa i file `.hs` e `.lhs` a Haskell. Funzioni e binding vengono estratti come callable, e type class, tipi `data` e `newtype` come tipi. Le chiamate vengono riconosciute nell'applicazione separata da spazi e attraverso gli operatori infissi, e gli import normalizzano le clausole `qualified`, `hiding` e `as`.

Type class e costruttori diventano relazioni del grafo:

- `instance Eq Point` registra che `Point` implementa `Eq`.
- Quando un metodo di classe ha un corpo predefinito nello stesso file, un'istanza che definisce quel metodo registra un override del predefinito.
- Applicare un costruttore di dati, come `Point 1 2`, conta come istanziazione.
- `error`, `undefined` e `throw` registrano throw, e gli handler come `catch` registrano catch.

Poiché le dichiarazioni di istanza possono definire nomi come `show` o `return`, una definizione nello stesso file non viene considerata automaticamente la destinazione di una chiamata senza receiver con quel nome.

## Esempi di prompt per agenti

- "Chi chiama `parseConfig`, e da quali moduli?" (`find_symbol`, poi `dependency_search` incoming)
- "Quali tipi hanno un'istanza di `ToJSON`?" (`dependency_search`)
- "Traccia come una richiesta viene decodificata e validata." (`get_task_context`)

## Limiti noti

- Circa 130 nomi del Prelude e di base, come `map`, `foldr`, `fmap`, `pure` e `>>=`, e moduli come `Data.List` e `Control.Monad`, vengono filtrati dalle relazioni. Usa `text_pattern_search` per trovarli.
- Nella grammatica un nodo di funzione grezzo indica anche i tipi di funzione, quindi il preset `functions` di `structural_search` restituisce solo lambda, e i preset `methods` e `variables` non selezionano nulla. Usa `find_symbol` per le funzioni con nome.
- I file letterati `.lhs` vengono letti per intero con la grammatica di Haskell, quindi aspettati risultati parziali.
- Haskell non ha una sintassi per i decorator, quindi le relazioni di decorator sono marcate come non applicabili.

## Prossimi passi

Collega un repository con la [guida rapida](/it/docs/quickstart), poi consulta la matrice di supporto nella [pagina di compatibilità](/it/docs/compatibility). Per altre basi di codice funzionali, leggi la [guida a Elixir](/it/languages/elixir).

## Dettagli del motore

- Il supporto a Haskell associa `.hs` e `.lhs` a Haskell. Type class, tipi `data` e `newtype` sono tipi, e le chiamate vengono riconosciute nell'applicazione per spazi e attraverso gli operatori infissi.
- `instance Eq Point` registra che `Point` implementa `Eq`, e un metodo di istanza che sostituisce un predefinito della classe nello stesso file registra un override.
- L'applicazione di un costruttore di dati conta come istanziazione, e circa 130 nomi del Prelude e di base vengono filtrati dalle relazioni.

## Punti di ingresso MCP utili

- `find_symbol`: Usalo per una funzione o un tipo quando ti servono definizione e riferimenti; i preset strutturali restituiscono solo lambda.
- `dependency_search`: Usa l'attraversamento incoming su una type class per vedere quali tipi ne hanno un'istanza.
- `get_task_context`: Usalo per prompt come "traccia come una richiesta viene decodificata e validata".
