Despliegue de árboles en anchura en Haskell: de colas a mónadas libres

Fuentes: Unfolding trees breadth-first in Haskell

Este artículo técnico analiza cómo construir un recorrido en anchura (breadth-first) sobre árboles en Haskell mediante un enfoque basado en niveles, composicional y dinámico. Partiendo de los folds y traversals en anchura ya conocidos —incluidos los trabajos de Okasaki (ICFP 2000) y la biblioteca tree-traversals con su funtor aplicativo Phases—, el texto plantea el problema de definir un unfold (anamorfismo) monádico que genere un árbol nivel a nivel.

La propuesta central es el desarrollo de un nuevo mecanismo —posteriormente publicado como la biblioteca weave en Hackage— que sustituye el zipping de funtores aplicativos libres de Phases por un zipping dentro de mónadas libres. Esto permite que los hijos de cada nodo se generen únicamente cuando dicho nodo se visita, cumpliendo el requisito de dinamismo. Se comparan tres estrategias: la basada en colas (generalización directa de Okasaki), la basada en niveles globales y la basada en el nuevo funtor aplicativo weave. Se discute el papel de la laziness para lograr la producción perezosa de niveles y se cierra con microbenchmarks que evalúan el rendimiento entre las alternativas.

El trabajo resulta relevante para la comunidad Haskell porque ofrece una solución composicional a un problema algorítmico no trivial, conecta con líneas clásicas (BFS, mónadas libres) y proporciona código reutilizable, literate y disponible en GitLab y Hackage.