[GHC] #8851: Standalone deriving and GND behave differently

GHC ghc-devs at haskell.org
Thu Mar 6 09:52:16 UTC 2014


#8851: Standalone deriving and GND behave differently
------------------------------------+-------------------------------------
       Reporter:  simonpj           |             Owner:
           Type:  bug               |            Status:  new
       Priority:  normal            |         Milestone:
      Component:  Compiler          |           Version:  7.6.3
       Keywords:                    |  Operating System:  Unknown/Multiple
   Architecture:  Unknown/Multiple  |   Type of failure:  None/Unknown
     Difficulty:  Unknown           |         Test Case:
     Blocked By:                    |          Blocking:
Related Tickets:                    |
------------------------------------+-------------------------------------
 Sergey Tromimovich writes: Trying to build random packages with fresh
 ghc-7.8.1-rc2 I've come up with a strange bit:

 https://github.com/trofi/Idris-
 dev/commit/9f93122ba1aa075c2fa1555fea68a6c403697e04

 Is it an intended behaviour that standalone deriving (A)
 {{{
     deriving instance Parsing IdrisInnerParser
 }}}
 is capable of doing more, than a deriving clause (B)
 {{{
     newtype IdrisInnerParser a
       = IdrisInnerParser { runInnerParser :: Parser a }
       deriving (Parsing)
 }}}
 where the class is defined thus
 {{{
 class Alternative m => Parsing m where
     ....
     notFollowedBy :: (Monad m, Show a) => m a -> m ()
     notFollowedBy p = try ((try p >>= unexpected . show) <|> pure ())
 }}}

 The error message from the (B) is
 {{{
 [50 of 75] Compiling Idris.ParseHelpers ( src/Idris/ParseHelpers.hs,
 dist/build/Idris/ParseHelpers.o )

 src/Idris/ParseHelpers.hs:40:97:
     Could not coerce from ‘Monad Parser’ to ‘Monad IdrisInnerParser’
       because the first type argument of ‘Monad’ has role Nominal,
       but the arguments ‘Parser’ and ‘IdrisInnerParser’ differ
       arising from the coercion of the method ‘notFollowedBy’ from type
                    ‘forall a. (Monad Parser, Show a) => Parser a -> Parser
 ()’ to type
                    ‘forall a.
                     (Monad IdrisInnerParser, Show a) =>
                     IdrisInnerParser a -> IdrisInnerParser ()’
     Possible fix:
       use a standalone 'deriving instance' declaration,
         so you can specify the instance context yourself
     When deriving the instance for (Parsing IdrisInnerParser)
 }}}

 Answer: no they should not behave differently.

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


More information about the ghc-tickets mailing list