У меня есть GADT, который всегда используется только с двумя разными параметрами: ForwardPossible и ():
-- | Used when a forward definition is possible.
data ForwardPossible = ForwardPossible deriving (Eq, Ord, Typeable, Data, Show)
-- | GADT which accepts forward definitions if parameter is ForwardPossible.
data OrForward t forward where
OFKnown :: t -> OrForward t forward
OFForward :: NamespaceID -> SrcSpan -> BS.ByteString -> OrForward t ForwardPossible
deriving instance Eq t => Eq (OrForward t forward)
deriving instance Ord t => Ord (OrForward t forward)
deriving instance Typeable2 OrForward
deriving instance Show t => Show (OrForward t forward)
Я хотел бы получить достаточно экземпляров Data.Data, чтобы охватить как OrForward t (), так и OrForward t ForwardPossible. Я не думаю, что возможен общий (Data t, Data forward) => OrForward t прямой экземпляр, если он не игнорирует OFForward, но либо перекрывающиеся экземпляры для Data t => OrForward t ForwardPossible и (Data t, Data forward) => Экземпляры OrForward t forward могут быть решением, если есть способ заставить ghc наследовать эти экземпляры.
Я попытался определить:
deriving instance Data t => Data (OrForward t ())
deriving instance Data t => Data (OrForward t ForwardPossible)
но затем ghc выдает мне такую ошибку:
Duplicate type signature:
Structure.hs:53:1-70: $tOrForward :: DataType
Structure.hs:52:1-49: $tOrForward :: DataType
DataKinds
, у вас может бытьdata OrForward t (forward :: Bool)
, а затем ваши два типа -OrForward t True
иOrForward t False
(или, конечно, вы можете создать свой собственный 2 типа и использовать его вместоBool
). - person Cactus   schedule 25.09.2012