# Haskell no Maguyva: grafos de código para type classes e módulos

Canonical source: https://maguyva.ai/pt-br/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).

O Maguyva oferece suporte a Haskell com AST, símbolos e grafo, para que agentes de IA sigam funções, instâncias de type classes e construtores de dados entre módulos.

## Panorama de suporte

- Nível: Suporte a AST e símbolos
- Programação
- Extensões: .hs, .lhs
- Parsing real de AST para busca com consciência de sintaxe e contexto estrutural.
- Símbolos nomeados alimentam a busca semântica e as referências cruzadas. A navegação por grafo fica disponível quando a extração de relações está habilitada.
- Esta linguagem fornece símbolos e relações para a busca orientada por grafo; os tipos de aresta compatíveis variam de acordo com seus construtos nativos.
- A análise de AST e a extração de símbolos estão disponíveis.

## Uso ideal

- Serviços e bibliotecas Haskell com muitos módulos, type classes e instâncias.
- Compiladores, parsers e outras bases de código em que mudar um tipo de dados tem efeitos distantes.
- Times que usam agentes de IA para ler Haskell desconhecido antes de um refactor.

## Fluxos de trabalho de agente

- Encontrar todos os chamadores de uma função antes de mudar sua assinatura de tipo.
- Listar quais tipos têm uma instância de uma type class.
- Rastrear onde um construtor de dados é construído e quais funções o consomem.

## Onde Haskell derruba ferramentas de IA superficiais

Haskell chama funções sem parênteses, compõe funções com operadores e faz dispatch por type classes. `render user` é uma chamada, `f . g <$> xs` contém várias, e `show` significa o que a instância daquele tipo disser. Uma busca de texto encontra os nomes, não as instâncias por trás deles.

O Maguyva registra instâncias e construtores como relações, para que um agente veja quais tipos implementam uma classe e onde um valor é construído.

## O que o Maguyva extrai em Haskell

O Maguyva associa arquivos `.hs` e `.lhs` a Haskell. Funções e bindings são extraídos como invocáveis, e type classes, tipos `data` e `newtype`s como tipos. Chamadas são reconhecidas na aplicação separada por espaços e por meio de operadores infixos, e os imports normalizam as cláusulas `qualified`, `hiding` e `as`.

Type classes e construtores viram relações do grafo:

- `instance Eq Point` registra que `Point` implementa `Eq`.
- Quando um método de classe tem um corpo padrão no mesmo arquivo, uma instância que define esse método registra um override do padrão.
- Aplicar um construtor de dados, como `Point 1 2`, conta como instanciação.
- `error`, `undefined` e `throw` registram throws, e handlers como `catch` registram catches.

Como declarações de instância podem definir nomes como `show` ou `return`, uma definição do mesmo arquivo não é assumida como alvo de uma chamada sem receiver com esse nome.

## Exemplos de prompts para agentes

- "Quem chama `parseConfig`, e de quais módulos?" (`find_symbol`, depois `dependency_search` incoming)
- "Quais tipos têm uma instância de `ToJSON`?" (`dependency_search`)
- "Rastreie como uma requisição é decodificada e validada." (`get_task_context`)

## Limitações conhecidas

- Cerca de 130 nomes do Prelude e do base, como `map`, `foldr`, `fmap`, `pure` e `>>=`, e módulos como `Data.List` e `Control.Monad`, são filtrados das relações. Use `text_pattern_search` para encontrá-los.
- Na gramática, um nó de função bruto também denota tipos de função, então o preset `functions` do `structural_search` retorna apenas lambdas, e os presets `methods` e `variables` não selecionam nada. Use `find_symbol` para funções nomeadas.
- Arquivos literate `.lhs` são lidos inteiros com a gramática do Haskell, então espere resultados parciais neles.
- Haskell não tem sintaxe de decorator, então as relações de decorator estão marcadas como não aplicáveis.

## Próximos passos

Conecte um repositório pelo [início rápido](/pt-br/docs/quickstart) e depois confira a matriz de suporte na [página de compatibilidade](/pt-br/docs/compatibility). Para outras bases de código funcionais, leia o [guia de Elixir](/pt-br/languages/elixir).

## Detalhes do motor

- O suporte a Haskell associa `.hs` e `.lhs` a Haskell. Type classes, tipos `data` e `newtype`s são tipos, e chamadas são reconhecidas na aplicação por espaços e por operadores infixos.
- `instance Eq Point` registra que `Point` implementa `Eq`, e um método de instância que substitui um padrão da classe no mesmo arquivo registra um override.
- Aplicar um construtor de dados conta como instanciação, e cerca de 130 nomes do Prelude e do base são filtrados das relações.

## Pontos de entrada MCP úteis

- `find_symbol`: Use para uma função ou tipo quando precisar da definição e das referências; os presets estruturais retornam apenas lambdas.
- `dependency_search`: Use a travessia incoming em uma type class para ver quais tipos têm instâncias.
- `get_task_context`: Use para prompts como "rastreie como uma requisição é decodificada e validada".
