Codificación tagless inicial en Rust con GADT sin coste en tiempo de ejecución

Fuentes: Zero-Cost 'Tagless Final' in Rust with GADT-style Enums

El patrón "tagless final" es una abstracción habitual en programación funcional para construir lenguajes de dominio específico con múltiples intérpretes —evaluación, pretty-printing, optimización— sobre una misma lógica. Este artículo explora su variante "tagless inicial", basada en tipos algebraicos generalizados (GADT), y demuestra que es posible replicarla en Rust conservando la promesa central del lenguaje: abstracción con coste cero en tiempo de ejecución.

La implementación define un tipo Gadt que envuelve un Enum cuyos constructores están tipados con el tipo "never" (!). El trait Attic controla qué variantes quedan habilitadas; al fijar todas a ! por defecto, sólo una variante puede construirse para cada firma, y el compilador elimina la etiqueta del enum por completo. El trait Cursor selecciona la configuración del Attic aplicable en cada nodo del árbol. El intérprete eval se reduce entonces a un match que el optimizador elimina, generando únicamente instrucciones aritméticas (leaq, addq) en ensamblador, sin despacho dinámico, sin allocations y sin bucle intérprete.

El artículo también plantea un experimento: sustituir el tipo ! por ((),) —un tipo de tamaño cero— y comprobar qué ocurre cuando la invariante se rompe, anticipando la diferencia en el código máquina generado. Se trata de un caso de estudio sobre programación a nivel de tipos en Rust, con aplicación en compiladores embebidos, DSLs y bibliotecas que necesiten múltiples intérpretes sin sacrificar rendimiento.