Proposal for stand-alone deriving declarations?

John Hughes rjmh at
Fri Oct 6 05:55:15 EDT 2006

    What I implemented in GHC is an extension of the proposal below. The
    proposal just mentions:

    deriving Class for Type

    In GHC I also added a form for newtype deriving of multi-parameter
    type classes:

    deriving (Class t1 ... tn) for Type

    I think that it's close to what we ended up with when talking about
    it at the Hackathon. My intuition about this syntax is that except
    for the "for Type" part, it looks the same as a normal deriving
    clause. The "for" part is just there to connect it to a data/newtype
    declaration. This lets it pretty much use the normal code for
    deriving declarations.

    Stand-alone deriving declarations are currently a little bit weaker
    than normal deriving clauses, since the current implementation does
    not let you reference the type arguments of a newtype in the
    arguments of an MPTC. See my response to Bulat on cvs-ghc at
    for more details.


A suggestion re syntax:

With the newtype-deriving extension, the instances named in a deriving clause are not just class names, but partial applications of class names to all but the last argument. Why all but the last one? Because the last one is the type being defined. Once deriving clauses are separated from type definitions, then there is no type being defined any more--hence the need for "for Type" in your syntax, and the introduction of another keyword. But why single out one class parameter, once deriving clauses are separated from type definitions? Why not simply write the FULL application of the class in the deriving list? Thus:

deriving (Eq Foo, Ord Foo)

instead of

deriving (Eq, Ord) for Foo

I find the former syntax clearer and more readable, actually.


More information about the Haskell-prime mailing list