假设我有以下代码:
{-# LANGUAGE GADTs, DeriveDataTypeable, StandaloneDeriving #-}
import Data.Typeable
class Eq t => OnlyEq t
class (Eq t, Typeable t) => BothEqAndTypeable t
data Wrapper a where
Wrap :: BothEqAndTypeable a => a -> Wrapper a
deriving instance Eq (Wrapper a)
deriving instance Typeable1 Wrapper
接着,下面的实例声明的作品, 不受制约t
:
instance OnlyEq (Wrapper t)
和做什么,我希望它做的事。
但是,下面的实例声明不工作:
instance BothEqAndTypeable (Wrapper t)
因为GHC - 我使用7.6.1 - 抱怨说:
No instance for (Typeable t)
arising from the superclasses of an instance declaration
Possible fix:
add (Typeable t) to the context of the instance declaration
In the instance declaration for `BothEqAndTypeable (Wrapper t)'
添加Typeable t
的背景下工作,当然。 但这样做增加了以下实例:
instance Typeable (Wrapper t) where
typeOf (Wrap x) = typeOf1 (Wrap x) `mkAppTy` typeOf x
有没有办法让GHC写这后一种情况下我吗? 如果是这样,怎么样? 如果不是,为什么不呢?
我希望GHC将能够拉Typeable
从上上下文约束Wrap
构造,只是因为它与没有Eq
约束。 我认为我的问题归结为一个事实,即GHC明确禁止写deriving instance Typeable (Wrapper t)
标准(Typeable1 s, Typeable a) => Typeable (sa)
实例不能“往里” sa
找一Typeable a
字典。