content: {-# LANGUAGE GeneralizedNewtypeDeriving, MultiParamTypeClasses, FlexibleInstances, FunctionalDependencies, FlexibleContexts, UndecidableInstances, StandaloneDeriving #-}
  module T3621 where
  
  -- This one is ok, even though the deriving clause mentions 'a'
  -- which is not a parameter of 'T'
  class C a b
  instance C a S
  data S = MkS
  
  newtype T = MkT S deriving( C a )
  
  
  -- But this one fails, and should fail
  class (Monad m) => MonadState s m | m -> s where
    state :: (s -> (a, s)) -> m a
  
  newtype State s a = State { runState :: s -> (a, s) }
  instance Functor (State s) where {}
  instance Applicative (State s) where {}
  instance Monad (State s) where {}
  instance MonadState s (State s) where {}
  
  newtype WrappedState s a = WS { runWS :: State s a }
     deriving (Functor, Applicative, Monad, MonadState state)
  --   deriving (Monad)
  
  deriving instance (MonadState state (State s))
        => MonadState state (WrappedState s)
  
  -- ASSERT error
  -- deriving instance (MonadState state (State s), Monad (WrappedState s))
  --      => MonadState s (WrappedState s)
  
  
  -- We try
  --   instance MonadState state (State state a)
  --         => MonadState state (WrappedState state a)
  --
  -- Superclass needs (Monad (WrappedState state a))
  