类型在运行时间之前被删除

时间:2016-04-04 02:54:34

标签: types compilation type-erasure agda type-theory

我确信在Haskell类型中总是在运行时删除。在Agda的情况下会发生什么?

是否将依赖类型信息传递给运行时?

1 个答案:

答案 0 :(得分:4)

什么运行时?至少有四个后端:针对GHC(称为MAlonzo),UHC,Epic和JavaScript的后端。一些初始细节可以在the Agda wiki中找到:您可以阅读Epic后端如何删除那里或paper中的类型(“3.3删除”一章)。简而言之,Epic和UHC后端会擦除完全应用函数接收的所有类型,但不会执行完全擦除,因为它可以更改程序的语义(引自paper关于UHC后端):

  

类型翻译

     

其余字词为ΠSetLevel   仅适用于类型检查。在Agda中,类型Set或类型的值   Level无法检查或模式匹配。正如Agda强制执行的那样   不可能观察到这些类型的任何价值,它们不可能   影响运行时语义。因此,为了执行程序,它是安全的   用单位值替换所有出现的这些值。

     

也可能想要完全删除这些的任何值   类。这可能会改变翻译的语义   程序。 Agda不评估lambdas下的表达式;落下   采用类型表达式的lambda抽象可以删除   阻止评估的lambda。可以部分擦除类型   一个健全的方式。例如,饱和函数应用程序可以始终如此   以这种方式优化。更详细的描述何时这种类型   可以在Letouzey以前的作品中找到合理的删除。