La defunzionalizzazione è una trasformazione del programma che converte i programmi di ordine superiore in programmi del primo ordine. L'idea è che dato un programma, ci sono solo finitamente molte lambda-astrazioni, quindi è possibile sostituire ogni lambda con un id e ogni applicazione di funzione con una chiamata a una procedura di applicazione che si ramifica su quell'id. Questo è talvolta usato nei compilatori per linguaggi funzionali, ma la sua applicabilità è limitata dal fatto che la defunzionalizzazione è una trasformazione dell'intero programma (è necessario conoscere staticamente tutte le funzioni del programma), e quindi solo i compilatori dell'intero programma fanno uso di esso.
Tuttavia, Pottier e Gauthier hanno dato un algoritmo di defunzionalizzazione tipizzato polimorficamente usando una tipizzazione più sofisticata che coinvolge GADT. Ora, data la loro codifica, è possibile aggiungere un caso generale al loro tipo di dati lambda che non è un tag, ma che contiene una funzione di ordine superiore. Ciò significa che dovrebbe essere possibile utilizzare la loro codifica per defunzionalizzare su base modulo per modulo.
Qualcuno l'ha fatto e mi ha indicato un compilatore che usa questa idea? (I compilatori di giocattoli vanno bene, e in effetti preferiscono.)