假設我正在編寫DSL並希望支持幻像類型支持和嚴重類型表達式。我的值類型可能是鍵入鑄造GADT
{-# LANGUAGE GADTs, DataKinds #-}
data Ty = Num | Bool deriving (Typeable)
data Val a where
VNum :: Int -> Val Num
VBool :: Bool -> Val Bool
,我可以用幻影工作擦除版本
{-# LANGUAGE ExistentialQuantification #-}
data Valunk = forall a . Valunk (V' a)
現在,我可以通過case
上的Valunk
值進行操作荷蘭國際集團出既VNum
和VBool
,甚至重新建立我的幻象這種方式
getNum :: Valunk -> Maybe (Val Num)
getNum (Valunk [email protected](VNum _)) = Just n
getNum _ = Nothing
但這只是感覺就像我在重新實現Typeable
機械。不幸的是,GHC不會讓我得出一個Typeable
爲Val
src/Types/Core.hs:97:13:
Can't make a derived instance of `Typeable (Val a)':
Val must only have arguments of kind `*'
In the data declaration for Val
有沒有辦法來解決這個限制?我很想寫
getIt :: Typeable a => Valunk -> Maybe (Val a)
getIt (Valunk v) = cast v
但現在我不得不求助於機械這樣
class Typeably b x where kast :: x a -> Maybe (x b)
instance Typeably Num Val where
kast [email protected](VNum _) = Just n
kast _ = Nothing
我所有的類型。
它LOO:
這與測試ks像'deriving(Typeable)'機器還沒有與'DataKinds'一起使用。 'DataKinds'不會給你任何驚人的,只是一點額外的檢查。你可以使用'data Num'和'data Bool'來代替你的'Ty'類型。 – luqui