Defuncionalização é uma transformação de programa que converte programas de ordem superior em programas de primeira ordem. A idéia é que, dado um programa, há apenas muitas abstrações lambda finitas, para que você possa substituir cada lambda por um id e cada aplicativo de função com uma chamada para um procedimento de aplicação que se ramifique nesse id. Às vezes, isso é usado em compiladores para linguagens funcionais, mas sua aplicabilidade é limitada pelo fato de que a defuncionalização é uma transformação de todo o programa (você deve conhecer estaticamente todas as funções do programa) e, portanto, apenas os compiladores de todo o programa fazem uso de isto.
No entanto, Pottier e Gauthier possuem um algoritmo de desfuncionalização de tipo polimórfico usando uma digitação mais sofisticada envolvendo GADTs. Agora, dada a codificação, é possível adicionar um caso abrangente ao tipo de dados lambda que não é uma tag, mas que contém uma função de ordem superior. Isso significa que deve ser possível usar a codificação para desfuncionalizar módulo por módulo.
Alguém já fez isso e me indicou um compilador usando essa idéia? (Os compiladores de brinquedos estão bem e de fato são os preferidos.)
fonte