LiquidHaskell 与 Idris 中的运行时 "type terms"

Runtime "type terms" in LiquidHaskell vs. Idris

我最近一直在研究 LiquidHaskell 和 Idris,我遇到了一个非常具体的问题,我在任何地方都找不到明确的答案。

Idris 是一种依赖类型的语言,在大多数情况下都很棒。然而,我读到类型检查期间的某些类型术语可以从编译时 "leak" 到 运行 时间,即使是艰难的 Idris 也会尽力消除这些术语(这甚至是一个特殊功能......)。然而,这种消除并不完美,有时确实会发生。如果、为什么以及何时发生这种情况,从代码中并不能立即清楚地看出,有时会对 运行 时间性能产生影响。

我看到人们更喜欢 Haskells 的类型系统,因为它不可能在那里发生。当类型检查完成时,它就完成了。类型是 "thrown away" 并且在 运行 时间内没有使用。

Liquid 的故事是什么Haskell?与传统的 Haskell 相比,它大大增强了类型系统的功能。 LiquidHaskell 是否也为某些类型 "constellations" 注入 运行 时间位,或者(正如我怀疑的那样)只是在 Haskell 之上添加另一层 "better" 类型不会以任何形式影响 运行-时间。

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

如果是,这似乎是两全其美,或者 LiquidHaskell 在类型系统中的表现力不如 Idris,因此在没有 运行 时间条件的情况下进行管理?

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

但是,我对你提出的问题有异议。可以争论的是,在某些情况下,某些类型的残留物必须在 Haskell 中的 运行 时间存活 - 特别是当涉及多态递归时。考虑这个函数:

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

无法静态确定使用 show 所涉及的确切类型。 从类型派生的东西 必须存活到 运行 时间。实际上,使用 type class 字典很容易做到这一点。理论上重要的细节是在 运行 时仍然选择了类型导向的行为。