Ticket #2734 (closed bug: invalid)

Opened 5 years ago

Last modified 5 years ago

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: Difficulty: Unknown
Test Case: Blocked By:
Blocking: Related Tickets:

Description (last modified by simonpj) (diff)

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

Changed 5 years ago by simonpj

  • status changed from new to closed
  • difficulty set to Unknown
  • resolution set to invalid
  • description modified (diff)

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.