内射型族和约束

时间:2016-10-06 00:00:03

标签: haskell type-families

假设我们有一些现有的类或约束C,以及以下内容:

{-# TypeFamilyDependencies #-}

type family F t = s | s -> t

type D s = (s ~ T t, C t)

当然type D s ...由于未知变量t而无法编译,但我如何编写D s之类的内容?我基本上想写:

type D s = (C (T_Inverse s))

我认为应该有效,因为存在注入T_Inverse。我只是不知道如何表达它。

1 个答案:

答案 0 :(得分:5)

我知道该怎么做才是

type family FI a
type D s = (s ~ F (FI s), C (FI s))

你必须自己形成(可能是部分的)部分FI,所以我不认为内射型家庭确实有帮助。在这一点上,内射型家庭似乎非常有限且不自然。举一个明显的例子,GHC甚至不会接受它们是单射的!

blah :: F a ~ F b => a :~: b
blah = Refl

未通过类型检查程序。