告诉Haskell'(反向(反向xs))~xs`

时间:2016-06-14 18:01:37

标签: haskell type-families

如果Reverse :: [k] -> [k]是一个类型系列,那么Haskell无法告诉(Reverse (Reverse xs)) ~ xs。有没有办法让类型系统知道这个而没有任何运行时成本?

我很想使用unsafeCoerce,但这似乎很遗憾。

1 个答案:

答案 0 :(得分:1)

我知道影响GHC中~行为的唯一方法是实际构建a :~: b的实例(或类似的;重要的是构造一个&#34的术语;证明"这对于typechecker)然后在Refl构造函数上进行模式匹配,这需要在运行时评估证明见证。我的理解是GHC中依赖类型的当前设计仍然需要运行所有类型相等的证明。然而,人们可以使用GHC的重写规则,在类型检查后,用非常低成本的函数(例如unsafeCoerce Refl :: Reverse (Reverse a) :~: a)替换证明证人,这将使评估成本非常低,但仍然安全(因为证明证人已经进行了检查,表明如果它终止,它将产生正确的证据。)

有关Haskell中依赖类型的当前状态的更多信息,请访问:https://typesandkinds.wordpress.com/2016/07/24/dependent-types-in-haskell-progress-report/