Pular para o conteúdo
cd /languages
  • Funcional puro
  • Programação
  • Suporte a AST e símbolos

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

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.

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 newtypes 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 e depois confira a matriz de suporte na página de compatibilidade. Para outras bases de código funcionais, leia o guia de Elixir.

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.

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