内射型族和约束

Cli*_*ton 4 haskell type-families

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

{-# TypeFamilyDependencies #-}

type family F t = s | s -> t

type D s = (s ~ T t, C t)
Run Code Online (Sandbox Code Playgroud)

当然type D s ...由于未知变量t而无法编译,但我怎么能写出类似的东西D s呢?我基本上想写:

type D s = (C (T_Inverse s))
Run Code Online (Sandbox Code Playgroud)

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

dfe*_*uer 5

我所知道的最好的方法是

type family FI a
type D s = (s ~ F (FI s), C (FI s))
Run Code Online (Sandbox Code Playgroud)

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

blah :: F a ~ F b => a :~: b
blah = Refl
Run Code Online (Sandbox Code Playgroud)

没有通过类型检查器.

  • 第二个例子不编译的事实真的很烦人. (2认同)