如何指定具有多参数单射性的类型族?

Gus*_*ten 8 haskell typeclass type-constraints type-families

我有一个A具有非单射关联类型的类型类Context

class A a where
   type Context a
Run Code Online (Sandbox Code Playgroud)

如此多的实例A可以具有相同的Context

的一些实例A也是类 的实例AA,该类具有两个附加关联类型BC

class (A a) => AA a where
   type B a
   type C a
   problematic :: Context a -> B a -> C a -> a

Run Code Online (Sandbox Code Playgroud)

目的是给定 a 、和uniqueidentityContext的组合,但我不知道如何表达这一点。B aC aa

我知道可以做出这样的限制

class A a where
   type B a = b | b -> a

Run Code Online (Sandbox Code Playgroud)

,但我需要的是某种具有多个参数的约束,例如(Context a, B a, C a) -> a. 如何才能实现这一目标?

Dan*_*ner 1

也许你可以退回一双。我还没有测试过这个,但它看起来像这样:

type family Fst a where Fst '(a, b) = a
type family Snd a where Snd '(a, b) = b
type B a = Fst (BC a)
type C a = Snd (BC a)

class A a => AA a where
    type BC a = b | b -> a
Run Code Online (Sandbox Code Playgroud)

您可能需要一些类型的签名来给类型检查器一个提示;类型检查器的编译时级别版本倾向于比运行时级别版本更早地单态化其类型。