Skip to content

Bad error message: Applicative is not a derivable class

You have GeneralizedNewtypeDeriving on and use deriving Applicative with something that you cannot derive Applicative on, GHC correctly says cannot eta-reduce the representation type enough.

If you don't have GeneralizedNewtypeDeriving on yet and deriving Applicative will work, GHC says something like "perhaps you want to enable GeneralizedNewtypeDeriving"?

However, if you don't have GeneralizedNewtypeDeriving AND if GHC figures out that if you enable it, the next message will be cannot eta-reduce the representation type enough, then GHC will state the most unhelpful Applicative is not a derivable class, which suggests to me that in general, Applicative is not derivable (which is wrong).

rwbarton's suggestion: Suggest enabling GeneralizedNewtypeDeriving in any case and then let the user see why it cannot be derived.

Some relevant #ghc chat:

rwbarton, that's GND again
rwbarton: I a ~ K a where K = ErrorT ImmError (ReaderT CliOptions (ReaderT Config IO)) is an instance of Applicative
rwbarton: so it can coerce the instance for K to an instance for I
nh2:      so is it the error message that is the confusing part here? It suggests that "In general, Applicative is not derivable"
nh2:      I mean it as: Shouldn't it give an error message like "can't derive an Applicative instance in this case because ..."?
rwbarton: well maybe it could add something like "Did you mean to use GeneralizedNewtypeDeriving?"
rwbarton: oh I see what you mean, even if you turn that extension on it gives the same error message
nh2:      yes, because we already have such a message in some cases
nh2:      no, in this case I had really forgotten the extension. If I add it, I get the "cannot eta-reduce the representation type enough" error, but I haven't figured out why I get it in this case yet
rwbarton: I wrote the condition above basically, "I a ~ K a where K = ... is an instance of Applicative" where ~ is the coercion/isomorphism introduced by the newtype
rwbarton: if you can't write down K then you can't use GND because where would it get the instance?
rwbarton: writing down K is eta reduction
nh2:      I'm wondering whether it doesn't suggest adding the extension because it already figured out I will not be able to eta-reduce?
rwbarton: oh yeah, it seems so
rwbarton: that seems a bit silly
nh2:      in this case, I think we should pimp the error message a bit
nh2:      (this is the thing I want to derive bwt: https://github.com/ganeti-github-testing/ganeti-test-1/blob/master/src/Ganeti/BasicTypes.hs#L147)
nh2:      what do you think would be the best error message to show in such a case?
nh2:      just suggest the GNTD suggestion regardless and let the user see afterwards that it cannot work?
rwbarton: I would just have it always suggest GND ... yeah
nh2:      ok I file a ticket for that
rwbarton: seems like more suggestions > fewer suggestions
rwbarton: even if this is a weird second-order case where there are two errors
Trac metadata
Trac field Value
Version 7.8.3
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC mail@nh2.me, rwbarton
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information