Haskell 类型族与索引子集的内射性

Haskell 类型族与索引子集的内射性,haskell,ghc,type-families,injective-function,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的注入性检查器不将其识别为注入wrt。关于第二个论点: * Type family equation violates injectivi

我有以下类型的族:

{-# 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
):

你提议

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

因此,如果给定
ret
,我们就不能推断
r
。我们不能有
ret->r
依赖关系

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


Const a b
看起来好像它尊重
ret->b
。然而,要检测到这一点,就需要一个归纳证明,而GHC推断出这一点并不明智。决定注入能力实际上是相当棘手的:请参阅第4.1节中的。为了克服这些问题,GHC必须被设计成在它所接受的内容上是保守的。

问题不在于
ReplaceRet(Int->Int)Int
ReplaceRet Int(Int->Int)
都解决了类型
Int->Int
,所以类型在第二个参数中不是内射的吗?好的,我应该睡觉了。想把这个变成一个我能接受的答案吗?对不起,@chi击败了你(可能在你发表评论之前就开始写这个答案了)。谢谢依我看,目前GHC中的注入性注释非常弱。即使
F
被声明为内射,GHC仍然不会从
fa~fb
中推断
a~b
。内射性似乎只能防止一些模棱两可的类型,如文档中所示。我宁愿打开
歧义类型
并使用显式类型参数处理歧义。那么常量呢?@SebastianGraf这是一个很好的观点。问题是,您需要根据类型的结构进行归纳推理,以推断
constar
是正确的。GHC没有走那么远。顺便说一句,我记得在关于内射性注释的论文中,作者展示了一些棘手的案例,这些案例看起来是内射的,但不是——因此他们不得不设计GHC,以限制它接受的内容:-(当然,它可以改进……谢谢,编辑您的答案以包含这些,我(再次)接受):)
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