Vai al contenuto
cd /languages
  • Funzionale puro
  • Programmazione
  • Supporto AST e simboli

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

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.

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, poi consulta la matrice di supporto nella pagina di compatibilità. Per altre basi di codice funzionali, leggi la guida a Elixir.

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.

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".