Diyelim ki bir DSL yazıyor ve hem fantom desteği hem de yanlış yazılan ifadeler için destek istiyorum. Hem VNum
ve VBool
dışarı ing case
tarafından Valunk
değerleri üzerinde işlem ve hatta benim hayaleti yeniden edebilir, sürüm ŞimdiTipik olarak GADT'leri yayınlama
{-# LANGUAGE ExistentialQuantification #-}
data Valunk = forall a . Valunk (V' a)
My değer türleri
{-# LANGUAGE GADTs, DataKinds #-}
data Ty = Num | Bool deriving (Typeable)
data Val a where
VNum :: Int -> Val Num
VBool :: Bool -> Val Bool
olabilir ve ben bir hayalet çalışabilirsiniz sildim Bu şekilde
getNum :: Valunk -> Maybe (Val Num)
getNum (Valunk [email protected](VNum _)) = Just n
getNum _ = Nothing
yılında tipleri Amareimplementing gibiyim bu sadece hissediyormakineleri. Ne yazık ki, GHC bu sınırlamayı aşmanın bir yolu var mı bana 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
için türetmek izin vermiyor? Ben
getIt :: Typeable a => Valunk -> Maybe (Val a)
getIt (Valunk v) = cast v
yazmak isterim ama şu anda benim türleri için bu
class Typeably b x where kast :: x a -> Maybe (x b)
instance Typeably Num Val where
kast [email protected](VNum _) = Just n
kast _ = Nothing
gibi makine başvurmak zorunda.
It:
Bu
ile test edildi türetme (Typeable) gibi ks henüz "DataKinds" ile çalışmaya başlamamıştır. 'DataKinds' size şaşırtıcı bir şey vermez, sadece biraz ekstra kontrol. 'Ty' türünüz yerine' data Num' ve 'data Bool' kullanabilirsiniz. – luqui