Дефункционализация - это программная трансформация, которая преобразует программы высшего порядка в программы первого порядка. Идея состоит в том, что для данной программы существует только конечное число лямбда-абстракций, поэтому вы можете заменить каждую лямбду идентификатором, а каждое приложение функции - вызовом процедуры apply, которая разветвляется на этот идентификатор. Это иногда используется в компиляторов для функциональных языков, но его применение ограничено тем , что утрата функции является преобразование целого программа (вы должны статически знать все функции в программе), и поэтому только целого программы компиляторы делают использование Это.
Тем не менее, у Поттье и Готье есть заданный алгоритм дефункционализации с полиморфной типизацией, использующий более сложную типизацию с использованием GADT. Теперь, учитывая их кодировку, можно добавить универсальный случай к их лямбда-типу данных, который не является тегом, но содержит функцию более высокого порядка. Это означает, что должна быть возможность использовать их кодирование для дефункциональной работы на основе модуля к модулю.
Кто-нибудь сделал это, и указывают мне на компилятор, использующий эту идею? (Игрушечные компиляторы в порядке, и на самом деле предпочтительнее.)
источник