
#12594: DeriveAnyClass fails to derive some classes -------------------------------------+------------------------------------- Reporter: ivanm | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.0.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- @@ -15,1 +15,1 @@ - • No instance for (Database.PostgreSQL.Simple.ToField.ToField Char) + • No instance for (ToRow Int) New description: {{{#!hs {-# LANGUAGE DeriveAnyClass, DeriveGeneric #-} import Database.PostgreSQL.Simple import GHC.Generics data Foo = Foo { bar :: Int } deriving (Generic, ToRow) }}} This succeeds using `ghci`, but fails when trying to compile it using `ghc` with the following error message: {{{ • No instance for (ToRow Int) arising from the first field of ‘Foo’ (type ‘Int’) Possible fix: use a standalone 'deriving instance' declaration, so you can specify the instance context yourself • When deriving the instance for (ToRow Foo) }}} However, it works if I use `instance ToRow Foo` instead of relying upon `DeriveAnyClass`. I've tried this with other types instead of `Int`, using `newtype` instead of `data` and having multiple fields in the datatype. -- Comment (by hsyl20): With DeriveAnyClass, GHC tries to infer the context for the instance. From compiler/typecheck/TcDeriv.hs: {{{ -- Unfortunately, it is not clear how to determine the context (in case of -- standard deriving; in standalone deriving, the user provides the context). -- GHC uses the same heuristic for figuring out the class context that it uses for -- Eq in the case of *-kinded classes, and for Functor in the case of -- * -> *-kinded classes. That may not be optimal or even wrong. But in such -- cases, standalone deriving can still be used. }}} Here it seems to infer {{{instance ToRow Int => ToRow Foo }}}, hence the error. Maybe we should add the previous comment into the manual. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/12594#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler