content: import Unsafe.Coerce
  
  data D1 a = C11 a deriving Show
  data D2 a b = C21 a | C22 b deriving Show
  data D3 a b c = C31 a | C32 b | C33 c deriving Show
  data D4 a b c d = C41 a | C42 b | C43 c | C44 d deriving Show
  data D5 a b c d e = C51 a | C52 b | C53 c | C54 d | C55 e deriving Show
  data D6 a b c d e f = C61 a | C62 b | C63 c | C64 d | C65 e | C66 f deriving Show
  data D7 a b c d e f g = C71 a | C72 b | C73 c | C74 d | C75 e | C76 f | C77 g deriving Show
  data D8 a b c d e f g h = C81 a | C82 b | C83 c | C84 d | C85 e | C86 f | C87 g | C88 h deriving Show
  
  d1 :: (Show a) => p a -> String
  d2 :: (Show a, Show b) => p a b -> String
  d3 :: (Show a, Show b, Show c) => p a b c -> String
  d4 :: (Show a, Show b, Show c, Show d) => p a b c d -> String
  d5 :: (Show a, Show b, Show c, Show d, Show e) => p a b c d e -> String
  d6 :: (Show a, Show b, Show c, Show d, Show e, Show f) => p a b c d e f -> String
  d7 :: (Show a, Show b, Show c, Show d, Show e, Show f, Show g) => p a b c d e f g -> String
  d8 :: (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h) => p a b c d e f g h -> String
  
  d1 = show . (unsafeCoerce :: p a -> D1 a)
  d2 = show . (unsafeCoerce :: p a b -> D2 a b)
  d3 = show . (unsafeCoerce :: p a b c -> D3 a b c)
  d4 = show . (unsafeCoerce :: p a b c d -> D4 a b c d)
  d5 = show . (unsafeCoerce :: p a b c d e -> D5 a b c d e)
  d6 = show . (unsafeCoerce :: p a b c d e f -> D6 a b c d e f)
  d7 = show . (unsafeCoerce :: p a b c d e f g -> D7 a b c d e f g)
  d8 = show . (unsafeCoerce :: p a b c d e f g h -> D8 a b c d e f g h)
  