【发布时间】:2012-09-16 10:08:40
【问题描述】:
我有一个 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 forward 实例是不可能的,除非它普遍忽略 OFForward,但是 Data t => OrForward t ForwardPossible 和 (Data t, Data forward) => 的重叠实例如果有办法让 ghc 派生这些实例,OrForward t 前向实例可能是一个解决方案。
我尝试过定义:
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
【问题讨论】:
-
作为一个小提示,如果您使用 GHC 7.4 或 7.6 和
DataKinds,您可以使用data OrForward t (forward :: Bool),然后您的两种类型是OrForward t True和OrForward t False(或者当然您可以制作自己的 2 种类型并使用它来代替Bool)。