Este artículo del blog de HaskellForAll aborda una recomendación de estilo para la construcción de registros (tipos de datos) en Haskell: priorizar la notación do sobre los operadores Applicative (como <$> y <*>). Aunque ambos métodos son válidos, la notación do ofrece ventajas significativas en términos de legibilidad, mantenibilidad y claridad de los mensajes de error.
¿Por qué usar do? La notación do facilita la construcción de registros al permitir una estructura más lineal y legible, especialmente cuando se introduce lógica adicional, como prompts al usuario. Considera la creación de un registro Person a partir de dos líneas de entrada. Usar operadores Applicative puede resultar en una expresión larga y difícil de entender, que a menudo requiere dividirla en múltiples líneas. La notación do, en cambio, permite una presentación más clara y secuencial de las operaciones.
Ventajas clave de do:
- Ergonomía: La notación
does más intuitiva y menos restrictiva, permitiendo una mejor organización del código. - Insensibilidad al orden: Si el orden de los campos en la definición del registro
Personcambia, el código que usadoseguirá funcionando correctamente. Esto no es cierto para la versión con operadoresApplicative, que podría fallar silenciosamente. - Mejores mensajes de error: Al agregar nuevos campos al registro, la versión
dogenera mensajes de error más claros y directos, indicando explícitamente qué campos no se han inicializado. Esto simplifica la depuración y el mantenimiento.
Limitaciones y Consideraciones:
- La recomendación se aplica principalmente a tipos de datos definidos con sintaxis de registro. No es aplicable a tipos con argumentos posicionales o funciones arbitrarias.
- Para usar
docon ciertos tipos de constructores (como el parser deoptparse-applicative), es necesario habilitar la extensión de lenguajeApplicativeDo.
En resumen, aunque los operadores Applicative son una herramienta poderosa, la notación do proporciona una alternativa más legible, mantenible y robusta para la construcción de registros en Haskell, especialmente en escenarios donde la lógica es más compleja o el orden de los campos puede cambiar.
