Saltar al contenido
cd /languages
  • Funcional puro
  • Programación
  • Soporte de AST y símbolos

Haskell en Maguyva: grafos de código para clases de tipos y módulos

Maguyva admite Haskell con AST, símbolos y grafo, para que los agentes de IA sigan funciones, instancias de clases de tipos y constructores de datos entre módulos.

Dónde Haskell hace tropezar a las herramientas de IA superficiales

Haskell llama a funciones sin paréntesis, las compone con operadores y despacha a través de clases de tipos. render user es una llamada, f . g <$> xs contiene varias, y show significa lo que diga la instancia de ese tipo. Una búsqueda de texto encuentra los nombres, no las instancias que hay detrás.

Maguyva registra instancias y constructores como relaciones, para que un agente vea qué tipos implementan una clase y dónde se construye un valor.

Qué extrae Maguyva en Haskell

Maguyva asigna los archivos .hs y .lhs a Haskell. Las funciones y los enlaces se extraen como invocables, y las clases de tipos, los tipos data y los newtype como tipos. Las llamadas se reconocen en la aplicación separada por espacios y a través de operadores infijos, y las importaciones normalizan las cláusulas qualified, hiding y as.

Las clases de tipos y los constructores se convierten en relaciones del grafo:

  • instance Eq Point registra que Point implementa Eq.
  • Cuando un método de clase tiene un cuerpo por defecto en el mismo archivo, una instancia que define ese método registra un override del valor por defecto.
  • Aplicar un constructor de datos, como Point 1 2, cuenta como instanciación.
  • error, undefined y throw registran throws, y los handlers como catch registran catches.

Como las declaraciones de instancia pueden definir nombres como show o return, no se asume que una definición del mismo archivo sea el destino de una llamada sin receptor con ese nombre.

Ejemplos de prompts para agentes

  • “¿Quién llama a parseConfig y desde qué módulos?” (find_symbol, luego dependency_search incoming)
  • “¿Qué tipos tienen una instancia de ToJSON?” (dependency_search)
  • “Rastrea cómo se decodifica y valida una petición.” (get_task_context)

Limitaciones conocidas

  • Unos 130 nombres del Prelude y de base, como map, foldr, fmap, pure y >>=, y módulos como Data.List y Control.Monad, se filtran de las relaciones. Usa text_pattern_search para encontrarlos.
  • En la gramática, un nodo de función en bruto también denota tipos de función, así que el preset functions de structural_search solo devuelve lambdas, y los presets methods y variables no seleccionan nada. Usa find_symbol para funciones con nombre.
  • Los archivos literarios .lhs se leen completos con la gramática de Haskell, así que espera resultados parciales en ellos.
  • Haskell no tiene sintaxis de decoradores, así que las relaciones de decoradores están marcadas como no aplicables.

Próximos pasos

Conecta un repositorio con el inicio rápido y luego revisa la matriz de compatibilidad en la página de compatibilidad. Para otras bases de código funcionales, lee la guía de Elixir.

Mejor uso

  • > Servicios y bibliotecas Haskell con muchos módulos, clases de tipos e instancias.
  • > Compiladores, parsers y otras bases de código donde cambiar un tipo de datos tiene efectos lejanos.
  • > Equipos que usan agentes de IA para leer Haskell desconocido antes de un refactor.

Flujos de trabajo del agente

  • > Encontrar todos los llamadores de una función antes de cambiar su firma de tipo.
  • > Listar qué tipos tienen una instancia de una clase de tipos.
  • > Rastrear dónde se construye un constructor de datos y qué funciones lo consumen.

Detalles del motor

  • > El soporte de Haskell asigna `.hs` y `.lhs` a Haskell. Las clases de tipos, los tipos `data` y los `newtype` son tipos, y las llamadas se reconocen en la aplicación por espacios y a través de operadores infijos.
  • > `instance Eq Point` registra que `Point` implementa `Eq`, y un método de instancia que reemplaza un valor por defecto de la clase en el mismo archivo registra un override.
  • > Aplicar un constructor de datos cuenta como instanciación, y unos 130 nombres del Prelude y de base se filtran de las relaciones.

Puntos de entrada MCP útiles

  • find_symbol

    Úsalo para una función o un tipo cuando necesites la definición y las referencias; los presets estructurales solo devuelven lambdas.

  • dependency_search

    Usa el recorrido incoming sobre una clase de tipos para ver qué tipos tienen instancias.

  • get_task_context

    Úsalo para prompts como "rastrea cómo se decodifica y valida una petición".