Skip to content

Newtype deriving doesn't work with type families

This assumes -XTypeFamiles -XGeneralizedNewtypeDeriving. Example:

class C a where
  type T a
  foo :: a -> T a

instance C Int where
  type T Int = Int
  foo = id

newtype N = N Int deriving(C)

This happily produces an instance C N but no type instance T N. It should either (preferably) generate

type instance T N = Int

or fail. The example also compiles if T is a data family (the Int instance needs to be change accordingly). It should probably fail in this case.

BTW, this also compiles fine, with rather dramatic consequences:

type family T a
class C a where
  foo :: a -> T a

type instance T Int = Int
instance C Int where
  foo = id

type instance T N = Double
newtype N = N Int deriving(C)

I guess this last example is the same bug as #1496 (closed). I wonder if the deriving clause could generate something like:

instance T Int ~ T N => C Int
Edited by Simon Peyton Jones
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information