[GHC] #9444: -ddump-deriv doesn't dump failed newtype-deriving

GHC ghc-devs at haskell.org
Mon Aug 25 15:58:25 UTC 2014


#9444: -ddump-deriv doesn't dump failed newtype-deriving
-------------------------------------+-------------------------------------
              Reporter:  goldfire    |            Owner:
                  Type:  bug         |           Status:  new
              Priority:  normal      |        Milestone:
             Component:  Compiler    |          Version:  7.8.2
            Resolution:              |         Keywords:
      Operating System:              |     Architecture:  Unknown/Multiple
  Unknown/Multiple                   |       Difficulty:  Unknown
       Type of failure:              |       Blocked By:
  None/Unknown                       |  Related Tickets:
             Test Case:              |
              Blocking:              |
Differential Revisions:              |
-------------------------------------+-------------------------------------

Comment (by simonpj):

 Think about
 {{{
 data T = MkT Int Int Bool (Int -> Bool) deriving( Read )
 }}}
 You probably ''don't'' want to see the parser code generated by a derived
 `Read` instance.  What you want to know is that the derived instance needs
 `Read` on each constructor argument.
 {{{
 T9444.hs:6:37:
     No instance for (Read (Int -> Bool))
       arising from the first field of ‘MkT’ (type ‘Int -> Int’)
     Possible fix:
       use a standalone 'deriving instance' declaration,
         so you can specify the instance context yourself
     When deriving the instance for (Read T)
 }}}
 It's the same for deriving `C`.  What you need to know is that we need a
 `Coercible (Int -> F Int) (Age -> F Age)` for each method of `C`.  (Here
 there is just one.)  And that is what fails:
 {{{
 T9444.hs:16:12:
     Could not coerce from ‘Bool’ to ‘F Age’
       because ‘Bool’
           and ‘F Age’
           are different types.
       arising from the coercion of the method ‘meth’
                    from type ‘Int -> F Int’
                      to type ‘Age -> F Age’
     Possible fix:
       use a standalone 'deriving instance' declaration,
         so you can specify the instance context yourself
     When deriving the instance for (C Age)
 }}}
 I think it's a pretty good error message!  I suppose the `arising from`
 part could say:
 {{{
    arising from the derived definition of method 'meth':
      instance ... => C Age where
        meth = coerce meth
 }}}
 but I'm not sure that will be much better, would it?

 Simon

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


More information about the ghc-tickets mailing list