La desfuncionalización es una transformación de programa que convierte los programas de orden superior en programas de primer orden. La idea es que, dado un programa, solo hay finitamente muchas abstracciones lambda, por lo que puede reemplazar cada lambda con un id, y cada aplicación de función con una llamada a un procedimiento de aplicación que se ramifica en ese id. Esto a veces se usa en compiladores para lenguajes funcionales, pero su aplicabilidad está limitada por el hecho de que la desfuncionalización es una transformación de todo el programa (debe conocer estáticamente todas las funciones del programa), por lo que solo los compiladores de todo el programa hacen uso de eso.
Sin embargo, Pottier y Gauthier tienen un algoritmo de desfuncionalización de tipo polimórfico dado que utiliza un tipo más sofisticado que involucra GADT. Ahora, dada su codificación, es posible agregar un caso general a su tipo de datos lambda que no es una etiqueta, pero que contiene una función de orden superior. Esto significa que debería ser posible usar su codificación para desfuncionalizar módulo por módulo.
¿Alguien ha hecho esto y me señala un compilador que usa esta idea? (Los compiladores de juguetes están bien, y de hecho son preferidos).