我有仅曾经与两个不同的参数,ForwardPossible和()中使用的GADT:如何在Haskell中为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)
我想获得足够Data.Data实例为涵盖OrForward吨()和OrForward吨ForwardPossible。我认为一般(Data t,Data forward)=> OrForward t向前实例是可能的,除非它普遍忽略向前,但是对于Data t => OrForward t ForwardPossible和(Data t,Data forward)=>如果有办法让ghc派生这些实例,OrForward t forward实例可能是一个解决方案。
我试图定义:
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',你可以有'数据OrForward吨(向前::布尔)',然后你的两种类型是'OrForward t True'和'OrForward t False“(或者当然你可以制作你自己的2型并使用它来代替'Bool')。 – Cactus