[GHC] #10598: DeriveAnyClass and GND don't work well together

GHC ghc-devs at haskell.org
Mon May 23 00:50:38 UTC 2016


#10598: DeriveAnyClass and GND don't work well together
-------------------------------------+-------------------------------------
        Reporter:  osa1              |                Owner:  RyanGlScott
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:  8.2.1
       Component:  Compiler          |              Version:  7.11
      Resolution:                    |             Keywords:  Generics
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by oerjan):

 Replying to [comment:25 RyanGlScott]:
 > It's not quite backwards-compatible—we'd also have to make a breaking
 change to `template-haskell` in order to accommodate the presence of these
 new pragmas. The type synonym approach, however, is only backportable to
 GHC 7.6.

 Ah, there's always something. Which reminds me, Haddock might possibly
 want to know about the distinctions, too.

 > > In any case, you should also decide how to annotate a `class`
 definition, which is where I actually suggested a pragma.
 >
 > I'm not sure what you mean. Are talking about annotating when you should
 use `DeriveAnyClass` (`DAC`)? Or something else?

 DAC or GND, both should be possible to specify. Neither is equivalent to
 having no annotation.

 The annotations on the class not only tell what you normally ''should''
 use, but also guide the compiler's selection for a newtype if the deriving
 clause does not itself have an annotation. Also, annotating the class
 removes the possibility of a warning if GHC must choose between DAC and
 GND because a module enables both as language extensions.

 To re-summarize my suggested system, when choosing what mechanism to use
 for deriving a class for a newtype:

 1. Annotations on the deriving clause take top precedence (with the
 exception of some builtin classes at least including, for safety,
 `Typeable`).
 2. Then builtin derivable status of the class.
 3. Then annotations on the class declaration.
 4. Only if none of the above exists are the module's enabled relevant
 language extensions (GND or DAC) used to choose. If both GND and DAC are
 enabled, a warning is given, and DAC is chosen.
 5. No matter what is chosen in the above, the module must have enabled any
 relevant language extensions.

 The guiding principles here being backwards compatibility (2,4), the
 ability to state intended usage at both class declaration and deriving
 sites (1,2,3), and reducing undetected surprises from irrelevant changes
 (4,5).

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


More information about the ghc-tickets mailing list