我确信在Haskell类型中总是在运行时删除。在Agda的情况下会发生什么?
是否将依赖类型信息传递给运行时?
答案 0 :(得分:4)
什么运行时?至少有四个后端:针对GHC(称为MAlonzo),UHC,Epic和JavaScript的后端。一些初始细节可以在the Agda wiki中找到:您可以阅读Epic后端如何删除那里或paper中的类型(“3.3删除”一章)。简而言之,Epic和UHC后端会擦除完全应用函数接收的所有类型,但不会执行完全擦除,因为它可以更改程序的语义(引自paper关于UHC后端):
类型翻译
其余字词为
Π
,Set
和Level
仅适用于类型检查。在Agda中,类型Set
或类型的值Level
无法检查或模式匹配。正如Agda强制执行的那样 不可能观察到这些类型的任何价值,它们不可能 影响运行时语义。因此,为了执行程序,它是安全的 用单位值⊤
替换所有出现的这些值。也可能想要完全删除这些的任何值 类。这可能会改变翻译的语义 程序。 Agda不评估lambdas下的表达式;落下 采用类型表达式的lambda抽象可以删除 阻止评估的lambda。可以部分擦除类型 一个健全的方式。例如,饱和函数应用程序可以始终如此 以这种方式优化。更详细的描述何时这种类型 可以在Letouzey以前的作品中找到合理的删除。