ForwardPossible と () の 2 つの異なるパラメーターでのみ使用される GADT があります。
-- | 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)
OrForward t () と OrForward t ForwardPossible の両方をカバーするのに十分な Data.Data インスタンスを派生させたいと考えています。一般的な (Data t, Data forward) => OrForward t 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