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

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

## Resumen de soporte

- Nivel: Soporte de AST y símbolos
- Programación
- Extensiones: .hs, .lhs
- Análisis AST real para búsqueda con reconocimiento de sintaxis y contexto estructural.
- Los símbolos con nombre alimentan la búsqueda semántica y las referencias cruzadas. La navegación por grafo está disponible cuando la extracción de relaciones está habilitada.
- Este lenguaje aporta símbolos y relaciones a la búsqueda basada en grafos; los tipos de arista disponibles varían según sus construcciones nativas.
- Están disponibles tanto el análisis AST como la extracción de símbolos.

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

## 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](/es/docs/quickstart) y luego revisa la matriz de compatibilidad en la [página de compatibilidad](/es/docs/compatibility). Para otras bases de código funcionales, lee la [guía de Elixir](/es/languages/elixir).

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