[GHC] #9600: Bad error message: Applicative is not a derivable class
GHC
ghc-devs at haskell.org
Tue Sep 16 21:10:01 UTC 2014
#9600: Bad error message: Applicative is not a derivable class
-------------------------------------+-------------------------------------
Reporter: nh2 | Owner:
Type: bug | Status: new
Priority: normal | Milestone: 7.10.1
Component: Compiler | Version: 7.8.3
Keywords: | Operating System:
Architecture: Unknown/Multiple | Unknown/Multiple
Difficulty: Easy (less than 1 | Type of failure:
hour) | None/Unknown
Blocked By: | Test Case:
Related Tickets: | Blocking:
| Differential Revisions:
-------------------------------------+-------------------------------------
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
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9600>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list