去功能化是一种程序转换,可将高阶程序转换为一阶程序。这个想法是,给定一个程序,只有有限的许多lambda抽象,因此您可以用id替换每个lambda,并使用对在该id上分支的apply过程的调用来替换每个函数应用程序。有时 在函数语言的编译器中使用此方法,但是它的适用性受到以下事实的限制:去功能化是整个程序的转换(您必须静态地了解程序中的所有功能),因此,只有整个程序的编译器才能使用它。
但是,Pottier和Gauthier使用了涉及GADT的更为复杂的类型化方法,从而为它提供了一种多态性类型的去功能化算法。现在,有了它们的编码,就可以向其lambda数据类型添加一个包罗万象的大小写,它不是标签,而是包含一个高阶函数。这意味着应该有可能使用它们的编码来逐模块地解除功能。
有没有人做过这个,并指出我使用这种想法的编译器?(玩具编译器还可以,实际上是首选。)