Opened 18 months ago

Closed 2 months ago

#7346 closed feature request (duplicate)

Allow the use of `deriving` for GHC generics

Reported by: kosmikus Owned by: dreixel
Priority: normal Milestone: 7.8.1
Component: Compiler Version: 7.7
Keywords: Cc: leather@…, hvr@…, v.dijk.bas@…, cgaebel@…, pho@…, carter.schonwald@…, gregmainland@…
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: None/Unknown Difficulty: Unknown
Test Case: Blocked By:
Blocking: Related Tickets: #5462

Description (last modified by simonpj)

Currently, a class that makes use of generic default methods (via the DefaultSignatures) extension can be instantiated by providing an empty instance declaration.

I propose to allow the use of deriving as well:

  1. Standalone deriving should be usable for a class not only for the specific set of classes supported by GHC now, but in addition for any class, if (
    • there's at least one generic default given for a method of the class, and
    • there are generic or normal default implementations for *all* methods of the class.

There are a number of advantages of this solution over the empty instance declaration: we make it explicit that something generic is going on here; we ensure at compile time that we're not missing an implementation of a method; and we come syntactically closer to built-in derivable classes.

In cases where a conflict arises between current GHC semantics and the proposed semantics (for example, when newtype-deriving is involved, I guess), I propose to stick with current GHC semantics, but I'm open for other suggestions.

  1. I'd also like for normal deriving to be useful under the same conditions as above. For normal deriving GHC has to figure out the class context automatically. I propose that if normal deriving is used, 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.

Change History (11)

comment:1 Changed 18 months ago by dreixel

  • Owner set to dreixel
  • Version changed from 7.6.1 to 7.7

Sounds good to me. I'm happy to implement this, if there are no objections. We'll probably need another extension name, though.

comment:2 Changed 18 months ago by spl

  • Cc leather@… added

comment:3 Changed 18 months ago by simonpj

  • Description modified (diff)
  • Difficulty set to Unknown

Some examples of what you have in mind would be useful. Perhaps update and elaborate the Wiki page about generic programming features in GHC?

But it sounds plausible.

Simon

Last edited 6 months ago by simonpj (previous) (diff)

comment:4 Changed 17 months ago by hvr

  • Cc hvr@… added

comment:5 Changed 17 months ago by basvandijk

  • Cc v.dijk.bas@… added

comment:6 Changed 17 months ago by cgaebel

  • Cc cgaebel@… added

comment:7 Changed 17 months ago by PHO

  • Cc pho@… added

comment:8 Changed 13 months ago by carter

  • Cc carter.schonwald@… added

comment:9 Changed 12 months ago by igloo

  • Milestone set to 7.8.1

comment:10 Changed 6 months ago by ghorn

  • Cc gregmainland@… added

comment:11 Changed 2 months ago by dreixel

  • Resolution set to duplicate
  • Status changed from new to closed

Probably best to focus the discussion on #5462.

Note: See TracTickets for help on using tickets.