LiquidHaskell与Idris中的运行时“类型术语”

时间:2018-12-14 23:14:54

标签: haskell idris type-systems liquid-haskell

最近我一直在与LiquidHaskell和Idris玩耍,我有一个非常具体的问题,我在任何地方都找不到明确的答案。

Idris是一种依赖类型的语言,在大多数情况下都非常有用。但是我读到,在类型检查期间某些类型项可能会从编译时“泄漏”到运行时,即使艰难的Idris也会尽力消除这些项(甚至是一项特殊功能。)。但是,这种消除并不完美,有时确实会发生。如果不能,为什么以及何时发生这种情况,尚无法从代码中立即得知,并且有时会影响运行时性能。

我看到人们更喜欢Haskells的类型系统,因为它不可能在那里发生。完成类型检查后,就完成了。类型被“丢弃”,在运行时不使用。

LiquidHaskell的故事是什么?与传统的Haskell相比,它大大增强了类型系统的功能。 LiquidHaskell是否还会为某些类型的“星座”注入运行时位,或者(如我所怀疑的)只是在Haskell上添加另一层“更好”的类型,而不会以任何形状或形式影响运行时。

意思是,如果删除了特殊的LiquidHaskell类型注释并使用标准GHC进行编译,则产生的代码是否始终相同?换句话说:LiquidHaskell扩展仅是编译时?

如果是,这似乎是两全其美,还是LiquidHaskell在类型系统中不像Idris那样具有表现力,因此无需运行时条件即可进行管理?

1 个答案:

答案 0 :(得分:3)

根据要求回答您的问题:Liquid Haskell允许您提供注释,该注释由编译器中的单独工具进行验证。代码仍然以完全相同的方式编译。

但是,我对您所提的问题有疑问。可以争论的是,在某些情况下,Haskell中某些类型的残基必须在运行时幸存,尤其是在涉及多态递归时。考虑一下此功能:

lots :: Show a => Int -> a -> String
lots 0 x = show x
lots n x = lots (n-1) (x,x)

无法静态确定使用show涉及的确切类型。从类型派生的 Something 必须在运行时生存。实际上,使用类型类字典很容易做到这一点。从理论上讲,重要的细节是在运行时仍在选择类型行为。