Дефункціоналізація - це програмне перетворення, яке перетворює програми вищого порядку в програми першого порядку. Ідея полягає в тому, що в даній програмі існує лише кінцево багато лямбда-абстракцій, тож ви можете замінити кожну лямбда на ідентифікатор, а кожну функціональну програму викликом до процедури застосування, яка розгалужується на цей ідентифікатор. Це іноді використовується в компіляторах для функціональних мов, але його застосовність обмежена тим, що дефункціоналізація - це трансформація цілої програми (ви повинні статично знати всі функції в програмі), і тому використовують лише цілі програми, що використовують компілятори це.
Однак Поттьє та Готьє мають заданий поліморфний алгоритм дефункціоналізації, використовуючи більш досконалий набір тексту, що включає GADT. Тепер, зважаючи на їхнє кодування, можна додати випадок "загальний вигляд" до їх типу даних лямбда, який не є тегом, але містить функцію вищого порядку. Це означає, що необхідно використовувати їх кодування для дефункціоналізації на основі модуля.
Хтось робив це, і вказав мені на компілятора, який використовує цю ідею? (Компілятори іграшок добре, і насправді кращі.)