
#10598: DeriveAnyClass and GND don't work well together -------------------------------------+------------------------------------- Reporter: osa1 | Owner: RyanGlScott Type: bug | Status: patch 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): Phab:D2280 Wiki Page: | -------------------------------------+------------------------------------- Comment (by RyanGlScott): I like your algorithm much better, since it has no jumps/gotos. I've updated the wiki page to use it. I've also updated the table to use more accurate labels. Thank you for the peer editing! As for your other questions:
Surely with the role situation, it will always fail even if you ask for it? Also, I noticed in the code you linked a comment that it wouldn't be equivalent in any case for law-breaking `Applicatives`.
Yes, it will always fail. But that's the point of `-XDerivingStrategies`—by explicitly using the `newtype` keyword, you take on the burden of ensuring that your typeclass can actually be derived, and you must accept the consequences if you try something which won't work.
My point in the rest of that comment was that even adding that phrase isn't ''enough'', because the wording and fallthrough still implies that anyclass would be used in this case:
{{{#!hs {-# LANGUAGE GeneralizedNewtypeDeriving, DeriveAnyClass #-}
newtype F x = F ([x], Maybe x) deriving Functor }}}
In fact, even assuming anyclass is not used, that example is a bit worrisome: What exactly does GHC do in this case? Does it succeed in deriving `Functor`? (I assume No.) If it fails, does it give an error message that doesn't confuse the user about why it fails?
That is a very good point, and one which your refactored table takes into account, so now the table reflects the reality that `-XDeriveAnyClass` does //not// fall through in this case. In case you're curious, here's the error message that GHC gives for that example: {{{ • Can't make a derived instance of ‘Functor F’ (even with cunning GeneralizedNewtypeDeriving): You need DeriveFunctor to derive an instance for this class • In the newtype declaration for ‘F’ }}} That seems like a sensible error to me. I'll add a test case for this in Phab:2280 to be safe. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10598#comment:45 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler