如果我有限制的类型有限DataKind
从DataKinds检索信息的约束存在的类型
{-# LANGUAGE DataKinds #-}
data K = A | B
data Ty (a :: K) = Ty { ... }
和忘记的类型K
确切的无奈...但是记住它在传递一种存在类型字典。
class AK (t :: K) where k :: Ty t -> K
instance AK A where k _ = A
instance AK B where k _ = B
data ATy where ATy :: AK a => Ty a -> ATy
这是真正的情况是ATy <-> Either (Ty A) (Ty B)
,但如果我想要写那些我需要使用unsafeCoerce
getATy :: ATy -> Either (Ty A) (Ty B)
getATy (ATy it) = case k it of
A -> Left (unsafeCoerce it)
B -> Right (unsafeCoerce it)
所以一般这个证人之一的作品,我可以忘记的选择K
使用ATy
并记住部分使用getATy
。总之,这充分利用了我可用的尽可能多的类型信息。
但是,如果正确完成,这种类型的信息就好像应该是“明显的”。
有没有办法实现上述不使用unsafeCoerce
?有没有办法摆脱存在的约束?这种技术是否可以完全基于数据类型提供的信息约束来执行?
Ahm ...'A - > Left Ty'? – leftaroundabout
啊,恩,让我改变这个例子,让它变得不那么琐碎。哎呦! –
'K'类型可能是幽灵,但它仍然传达了很多信息。 –