Overlapping instances for poly-kinded data

Gabor Greif ggreif at gmail.com
Sun Apr 12 14:33:46 UTC 2015

Hi all,

I observe a strange "deriving Show" behaviour for my data type Foo
that has proxies:

data Foo :: k -> * where
  Foo :: Proxy t -> Foo t

deriving instance Show (Foo t)

This works as expected. But now I add

instance {-# OVERLAPPING #-} KnownSymbol s => Show (Proxy (s :: Symbol)) where
  show = ('#' :) . symbolVal
instance {-# OVERLAPPING #-} KnownNat n => Show (Proxy (n :: Nat)) where
  show = ('#' :) . show . natVal

these orphan instances, and "deriving Show" won't pick them up. When I
go and specialise
deriving instance {-# OVERLAPPING #-} KnownNat t => Show (Foo (t :: Nat))
deriving instance {-# OVERLAPPING #-} KnownSymbol s => Show (Foo (s :: Symbol))

then it seems to work allright. Is polykinded derivation so different
from the monokinded one? Or is this simply a bug?

(a more elaborate WIP example can be found here:



More information about the ghc-devs mailing list