content: {-# LANGUAGE QuantifiedConstraints, PolyKinds, ScopedTypeVariables
             , StandaloneDeriving, RoleAnnotations, TypeApplications
             , UndecidableInstances, InstanceSigs
             , GeneralizedNewtypeDeriving #-}
  
  module T9123a where
  
  import Data.Coerce
  
  class MyMonad m where
    join :: m (m a) -> m a
  
  newtype StateT s m a = StateT (s -> m (a, s))
  
  type role StateT nominal representational nominal   -- as inferred
  
  instance MyMonad m => MyMonad (StateT s m) where
    join = error "urk"  -- A good impl exists, but is not
                        -- of interest for this test case
  
  newtype IntStateT m a = IntStateT (StateT Int m a)
  
  type role IntStateT representational nominal   -- as inferred
  
  instance (MyMonad m, forall p q. Coercible p q => Coercible (m p) (m q))
                 => MyMonad (IntStateT m) where
    join :: forall a. IntStateT m (IntStateT m a) -> IntStateT m a
    join = coerce @(StateT Int m (StateT Int m a) -> StateT Int m a)
                  @(IntStateT  m (IntStateT  m a) -> IntStateT  m a)
                  join
  