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

GHC ghc-devs at haskell.org
Mon May 23 10:40:43 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 RyanGlScott):

 Replying to [comment:27 simonpj]:
 > An alternative would be to require an instance declaration for DAD, thus
 > {{{
 > instance C a => C (T a)
 > }}}
 > That's all that is required, provided `C` has suitable generic default
 methods and `T` is an instance of `Generic`.  And if DAC always used this
 route, there'd be less ambiguity in the `deriving` clause of a data type
 declaration.

 I would strongly object to this! Literally the whole reason why I want
 this feature in the first place is so I can combine
 `GeneralizedNewtypeDeriving` with `DeriveAnyClass` in the presence of
 `deriving` clauses (which very conveniently don't require providing
 context). And moreover, if type out an instance manually like that, it's
 no longer `DeriveAnyClass`, it's pure Haskell 98! So imposing this
 "requirement" for `DeriveAnyClass` is tantamount to completely losing its
 utility, in my opinion.

 > I think (but I am not sure) that we don't allow standalone deriving for
 DAC; thus
 > {{{
 > deriving instance C a => C (T a)
 > }}}
 > would not work for DAC.  Is that right?  It seems reasonable to disallow
 it, because it's one word longer than the ordinary instance declaration.
 And if it is disallowed, then builtin and GND are already treated
 differently to DAC.  So we'd get
 >  * GND/builtin: `deriving` clauses and `deriving instance` declarations
 >  * DAC: always a plain `instance` decl
 >
 > I know that's not backward compatible..

 We do currently allow `StandaloneDeriving` to be used with any deriving
 strategy in existence, including `DeriveAnyClass`. You're right that using
 `DeriveAnyClass` in this fashion is a tad redundant (you can just as well
 drop the `deriving` part and get the same thing), but I don't think
 there's any reason to explicitly disallow it—after all, that would be
 another breaking change, and it does seem a bit //ad hoc// to disallow one
 form of `deriving` here when it could easily work with the ideas proposed
 in this ticket.

 > On Ryan's synonym thing, like oerjan I'm uncomfortable with pressing
 synonyms into service like this.

 OK, that's two votes against that idea, so I'll stop pursuing it :) In
 that case, pragmas looks like the path forward. Do the following names
 sound reasonable for pragmas?

 * `{-# BUILTIN #-}`
 * `{-# GND #-}`
 * `{-# DAC #-}` (goldfire proposed `{-# ANY #-}` above, but I'd argue that
 is a bit too ambiguous)

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


More information about the ghc-tickets mailing list