2016-12-13 22 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