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

标签 haskell ghc type-families injective-function

我有以下类型系列:

{-# 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 的单射性检查器不会将其识别为单射性。到它的第二个参数:

    * 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 并没有那么聪明地推断出这一点。决定单射性实际上相当棘手:请参阅 awkward cases in the paper ,请参阅第 4.1 节,以获得一些惊喜。为了克服这些问题,GHC 的设计必须在其接受的内容上保持保守。

关于haskell - 索引子集中的类型族和单射性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46227353/

相关文章:

haskell - 将字典变成约束

haskell - 更广义的新类型推导

Haskell/GHC - Haskell 有没有办法只返回 16 位小数?

haskell - 混合类型类和类型族时的问题

haskell - Haskell 中的模糊实例解析

haskell - 文件开头无用的种类相等错误

Scala vs Haskell 类型类 : "catchall" instances

haskell - 返回一个列表,其中包含一对元素,但前提是各个元素的总和是奇数

compiler-construction - Haskell 编译器是如何工作的?

json - 在 Haskell 中解析/导出任意嵌套的 JSON 对象到映射