Skip to content

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

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.

Edited by Simon Peyton Jones
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information