
#14243: GHC doesn't add constraint when deriving -------------------------------------+------------------------------------- Reporter: Iceland_jack | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.2.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: #11008 | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by RyanGlScott): * related: => #11008 Comment: This is expected behavior. Here's a much simpler demonstration of this phenomenon: {{{#!hs {-# LANGUAGE TypeFamilies #-} type family Foo data Bar = Bar Foo deriving Show }}} {{{ Bug.hs:4:29: error: • No instance for (Show Foo) arising from the first field of ‘Bar’ (type ‘Foo’) Possible fix: use a standalone 'deriving instance' declaration, so you can specify the instance context yourself • When deriving the instance for (Show Bar) | 4 | data Bar = Bar Foo deriving Show | ^^^^ }}} As you noted, GHC could theoretically add this inferred `Show Foo` constraint to the derived instance context, but it chooses not to. The reasoning is outlined in [https://downloads.haskell.org/~ghc/8.2.1/docs/html/users_guide/glasgow_exts.... #inferred-context-for-deriving-clauses this section] of the users' guide. Essentially, GHC has a metric for determining whether an inferred context is "exotic", and if a constraint is considered too exotic, GHC will give up and demand that you write the context yourself using `StandaloneDeriving`. There are a couple of reasons why GHC does this. One reason is that exotic constraints are often not Haskell98/2010, so inferring them would be troublesome. But perhaps a more compelling reason is it can sometimes catch mistakes, like in this code: {{{#!hs data X a b = MkX (a -> b) deriving Eq }}} This fails, complaining about a missing `Eq (a -> b)` instance. This is almost certainly the desired behavior, since you probably didn't mean to use an `Eq` instance for function types in the first place! If you're determined that this is the right thing to do, however, GHC gives you a manual override in the form of `StandaloneDeriving`. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14243#comment:3 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler