索引子集中的类型族和单射性
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 的设计必须使其接受的内容保持保守。
我有以下类型系列:
{-# 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 的设计必须使其接受的内容保持保守。