La défonctionnalisation est une transformation de programme qui convertit des programmes d'ordre supérieur en programmes de premier ordre. L'idée est que, compte tenu d'un programme, il n'y a qu'un nombre fini d'abstractions lambda, vous pouvez donc remplacer chaque lambda par un identifiant et chaque application de fonction par un appel à une procédure apply qui se ramifie sur cet identifiant. Ceci est parfois utilisé dans les compilateurs pour les langages fonctionnels, mais son applicabilité est limitée par le fait que la défonctionnalisation est une transformation de programme entier (vous devez connaître statiquement toutes les fonctions du programme), et donc seuls les compilateurs de programme complet utilisent il.
Cependant, Pottier et Gauthier ont donné un algorithme de défonctionnalisation typé polymorphe utilisant un typage plus sophistiqué impliquant des GADT. Maintenant, étant donné leur encodage, il est possible d'ajouter un casier fourre-tout à leur type de données lambda qui n'est pas une balise, mais qui contient une fonction d'ordre supérieur. Cela signifie qu'il devrait être possible d'utiliser leur codage pour un dysfonctionnement module par module.
Quelqu'un a-t-il fait cela et m'a dirigé vers un compilateur utilisant cette idée? (Les compilateurs de jouets sont corrects et en fait préférés.)