我有一个类型类
A
与非单射关联类型 Context
class A a where
type Context a
如此多的
A
实例可以具有相同的 Context
。
A
的一些实例也是AA
类的实例,该类具有两个附加关联类型:B
和C
。
class (A a) => AA a where
type B a
type C a
problematic :: Context a -> B a -> C a -> a
目的是给定一个
Context
,B a
和C a
的组合唯一地标识a
,但我不知道如何表达这一点。
我知道可以做出这样的约束
class A a where
type B a = b | b -> a
,但我需要的是某种具有多个参数的约束,例如
(Context a, B a, C a) -> a
。如何才能实现这一目标?
也许您可以退回一双。我还没有测试过,但它看起来像这样:
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