
#5462: Deriving clause for arbitrary classes -------------------------------------+------------------------------------- Reporter: simonpj | Owner: dreixel Type: feature | Status: new request | Milestone: ⊥ Priority: normal | Version: 7.2.1 Component: Compiler | Keywords: Generics Resolution: | Architecture: Unknown/Multiple Operating System: | Difficulty: Unknown Unknown/Multiple | Blocked By: Type of failure: | Related Tickets: #7346 None/Unknown | Test Case: | Blocking: | Differential Revisions: | -------------------------------------+------------------------------------- Comment (by dreixel): Replying to [comment:29 rwbarton]:
Can't we determine the context for the derived instance from the contexts of the default method type signatures?
Not really. Look at the [http://www.haskell.org/haskellwiki/GHC.Generics serialisation example from the wiki page]: {{{ putDefault :: (Generic a, GSerialize (Rep a)) => a -> [Bit] }}} Nothing here tells us that we need `Serialize` constraints on the datatype parameters. More info comes from the K1 instance, though: {{{ instance (Serialize a) => GSerialize (K1 i a) where gput (K1 x) = put x }}} Here we see that the constructor arguments will require a `Serialize` instance. So if parameter `a` appears as argument to a constructor, we should introduce the constraint `Serialize a`. But this is non-trivial in general... the constraint might be part in an instance of the form `K1 i a :*: g`, for example. I think going for Andres's proposal is still the best idea, as it is simple and relates to something people already know. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/5462#comment:30 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler