2016-12-13 63 views
3

是否可以指定数据库的每个成员满足类型类型,从而隐含类约束?例如。Typeclass在数据类型的每个值上实例化

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 

基本上aAB所以我们肯定有中Foo它一个实例。 我发现它不太可能 - 它将在哪里得到Foo字典? - 但我在一天中看到了一些魔法。

+0

我把它作为http://stackoverflow.com/questions/32408110/datakinds-and-type-class-instances的副本关闭,但重新打开它。单独的'Foo'类限制只能在'AB'上操作,可能会给我无法想象的魔法空间。 – Cirdec

回答

6

不,你不能这样做。主要的问题是,正如你所提到的,没有什么可以为你提供一本字典。但另一个问题是,您声称AB中的每个类型都是Foo的实例是错误的。

type family Broken :: AB where 
+0

或'GHC.Exts.Any :: AB'。 – Alec

+0

有趣的是,我没有考虑过所有类型都可能有“底”,这肯定会在语义上阻碍事物的发展。然后,限制到正常形式的类型是有意义的,也许有一个类“NF k”,然后可以用它来提供必要的字典。嗯....无论如何,谢谢你的洞察 – luqui

+0

@luqui,一个单身人士会做。数据ABy x其中Ay :: ABy'A;按:: ABy'B'。如果你喜欢,'类KnownAB x其中knownAB :: ABy x'。 'knownAB'上的模式匹配允许您使用这些实例。 – dfeuer