[GHC] #12616: type synonyms confuse generalized newtype deriving role checking

GHC ghc-devs at haskell.org
Sat Sep 24 14:47:56 UTC 2016


#12616: type synonyms confuse generalized newtype deriving role checking
-------------------------------------+-------------------------------------
           Reporter:  daviddarais    |             Owner:
               Type:  bug            |            Status:  new
           Priority:  low            |         Milestone:
          Component:  Compiler       |           Version:  8.0.1
           Keywords:  generalized    |  Operating System:  Unknown/Multiple
  newtype deriving roles rankntypes  |
       Architecture:                 |   Type of failure:  GHC rejects
  Unknown/Multiple                   |  valid program
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 Below is a small Haskell file showing the problem. It defines a simple
 `MonadTrans` typeclass, but using a type operator `~>`. When using the
 type operator, GHC complains that generalized newtype deriving gets stuck
 on a nominal role, but when the type operator is not used then GND works
 just fine.

 Perhaps this is just expected behavior with mixing RankNTypes and GND (and
 roles), but it's rather unfortunate.

 {{{#!hs
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE TypeOperators #-}

 module GND where

 type m ~> n = forall a. m a -> n a

 class MonadTrans t where
   -- > this line works:
   -- lift :: (Monad m) => m a -> t m a
   -- > this line doesn't:
   lift :: (Monad m) => m ~> t m

 data StateT s m a = StateT { runStateT :: s -> m (a, s) }

 instance MonadTrans (StateT s) where
   lift xM = StateT $ \ s -> do { x <- xM ; return (x,s) }

 newtype OtherStateT s m a = OtherStateT { runOtherStateT :: StateT s m a }
   deriving (MonadTrans)
 }}}

 The error message is:

 {{{
 GND.hs:23:13: error:
     • Couldn't match representation of type ‘m1 ~> StateT s m1’
                                with that of ‘m1 a1 -> OtherStateT s m1 a1’
         arising from a use of ‘GHC.Prim.coerce’
     • In the expression:
           GHC.Prim.coerce (lift :: (~>) m (StateT s m)) ::
             forall (m :: TYPE GHC.Types.PtrRepLifted
                          -> TYPE GHC.Types.PtrRepLifted).
             Monad m => (~>) m (OtherStateT s m)
       In an equation for ‘lift’:
           lift
             = GHC.Prim.coerce (lift :: (~>) m (StateT s m)) ::
                 forall (m :: TYPE GHC.Types.PtrRepLifted
                              -> TYPE GHC.Types.PtrRepLifted).
                 Monad m => (~>) m (OtherStateT s m)
       When typechecking the code for ‘lift’
         in a derived instance for ‘MonadTrans (OtherStateT s)’:
         To see the code I am typechecking, use -ddump-deriv
       In the instance declaration for ‘MonadTrans (OtherStateT s)’
     • Relevant bindings include
         lift :: m ~> OtherStateT s m (bound at GND.hs:23:13)
 }}}

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/12616>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list