Defunkcjonalizacja to transformacja programu, która przekształca programy wyższego rzędu w programy pierwszego rzędu. Chodzi o to, że biorąc pod uwagę program, istnieje tylko skończona liczba abstrakcji lambda, więc można zastąpić każdą lambda identyfikatorem, a każdą aplikację funkcji wywołaniem procedury wprowadzania, która rozgałęzia się na tym identyfikatorze. Jest to czasami używane w kompilatorach dla języków funkcjonalnych, ale jego zastosowanie jest ograniczone przez fakt, że defunkcjonalizacja jest transformacją całego programu (musisz statystycznie znać wszystkie funkcje w programie), dlatego tylko kompilatory całego programu korzystają z to.
Jednak Pottier i Gauthier mają określony algorytm defunkcjonalizacji o typie polimorficznym, wykorzystujący bardziej wyrafinowane typowanie z udziałem GADT. Teraz, biorąc pod uwagę ich kodowanie, możliwe jest dodanie wielkiej wielkości liter do ich typu danych lambda, który nie jest znacznikiem, ale zawiera funkcję wyższego rzędu. Oznacza to, że powinno być możliwe wykorzystanie ich kodowania do defekcjonalizacji na zasadzie moduł po module.
Czy ktoś to zrobił i wskazał mi kompilator korzystający z tego pomysłu? (Kompilatory zabawek są w porządku i faktycznie preferowane).
źródło