Opened 11 years ago

Closed 11 years ago

#2734 closed bug (invalid)

Newtype deriving over phantom types broke between GHC 6.6.1 and GHC 6.8.1

Reported by: DavidA Owned by:
Priority: normal Milestone:
Component: Compiler Version: 6.8.3
Keywords: newtype deriving, phantom type Cc:
Operating System: Windows Architecture: x86
Type of failure: None/Unknown Test Case:
Blocked By: Blocking:
Related Tickets: Differential Rev(s):
Wiki Page:

Description (last modified by simonpj)

Consider the following code:

{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}

data Lex

data Glex

newtype Monomial ord = M [Int] deriving (Eq,Show)

instance Ord (Monomial Lex) where
    compare (M xs) (M ys) = compare xs ys

instance Ord (Monomial Glex) where
    compare (M xs) (M ys) = compare (sum xs, xs) (sum ys, ys)

-- newtype Polynomial ord = P [Monomial ord] deriving (Eq,Show,Ord)

newtype Polynomial ord = P [Monomial ord] deriving (Eq,Show)

instance Ord (Monomial ord) => Ord (Polynomial ord) where
    compare (P ts) (P us) = compare ts us

In 6.6.1, it was permissible to derive the Ord instance for Polynomial ord from the ord instance for Monomial ord - the commented out code would compile. In 6.8.1-3, the commented out code doesn't compile, so you have to do the derivation by hand, as shown.

Change History (1)

comment:1 Changed 11 years ago by simonpj

Description: modified (diff)
difficulty: Unknown
Resolution: invalid
Status: newclosed

I'm afraid this is by design: the 6.6 deriving mechanism could all-too-easily infer a stupid context for the derived instance declaration.

However 6.10 lets you specify the context for the derived instance declaration (rather than having it inferred) thus:

 newtype Polynomial ord = P [Monomial ord] deriving (Eq,Show)

 deriving instance Ord (Monomial ord) => Ord (Polynomial ord)

The deriving instance is half way between deriving(Ord) and giving a full instance declaration, which you didn't want to do. It's documented under "standalone deriving" in the user manual.

If the documentation could be improved, I'd welcome concrete suggestions. Meanwhile I'm closing the bug.

Simon

Note: See TracTickets for help on using tickets.