在数据种类的每个值上实例化的类型类

Typeclass instantiated on every value of a data kind

是否可以指定数据种类的每个成员都满足类型class,从而隐含class 约束?例如

data AB = A | B
class Foo (a :: AB) where get :: proxy a -> String
instance Foo A where get _ = "A"
instance Foo B where get _ = "B"

-- note lack of constraint here
get' :: proxy (a :: AB) -> String
get' = get

基本上 a 是一个 AB,所以我们确定它有一个 Foo 的实例。 我觉得这不太可能——它要从哪里得到 Foo 字典? -- 但我这一天看到了一些魔法。

不,你不能那样做。主要问题是,正如您提到的,那里没有任何东西可以给您一本字典。但另一个问题是,您声称 AB 中的每种类型都是 Foo 的实例是错误的。

type family Broken :: AB where