索引子集中的类型族和单射性

Type families and injectivity in a subset of indexes

我有以下类型系列:

{-# LANGUAGE TypeFamilyDependencies #-}

type family Const arr r = ret | ret -> r where
  Const (_ -> a) r = Const a r
  Const _  r = r

这只是变相的 Const 函数,但 GHC 8.2.1 的内射性检查器不将其识别为内射 wrt。到它的第二个参数:

    * Type family equation violates injectivity annotation.
      RHS of injective type family equation cannot be a type family:
        Const (_ -> a) r = Const a r
    * In the equations for closed type family `Const'
      In the type family declaration for `Const'
  |
4 |       Const (_ -> a) r = Const a r
  |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

如果你忽略第一个案例,它是有效的,这让我相信功能是存在的,但还没有真正成熟。

我可以用其他方式来表述它以便 GHC 识别单射性吗?它实际上是针对这个稍微复杂一点的情况(所以 arr 确实被使用了):

{-# LANGUAGE TypeFamilyDependencies #-}

type family ReplaceRet arr r = ret | ret -> r where
  ReplaceRet (a -> b) r = a -> ReplaceRet b r
  ReplaceRet _  r = r

你求婚

type family ReplaceRet arr r = ret | ret -> r where
  ReplaceRet (a -> b) r = a -> ReplaceRet b r
  ReplaceRet _  r = r

但是

ReplaceRet (Int -> Bool) Char = Int -> Char
ReplaceRet Bool (Int -> Char) = Int -> Char

因此,给定 ret 是不正确的,我们可以推导出 r。我们不能有 ret -> r 依赖项。

我们可以 arr ret -> r 代替,但据我所知,GHC(目前?)还不支持这种对类型族的依赖。

Const a b貌似尊重ret -> b。然而,检测到这一点需要归纳证明,而 GHC 并不是那么聪明地推断出这一点。决定单射性实际上非常棘手:请参阅第 4.1 节中的 awkward cases in the paper,了解一些惊喜。为了克服这些问题,GHC 的设计必须使其接受的内容保持保守。