# Pastebin izOXtZzZ {-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} import Data.Typeable data Foo where Foo :: (Typeable a, Show a) => {field :: a} -> Foo printType :: forall a. Typeable a => String printType = show $ typeRep (Proxy :: Proxy a) showFoo :: Foo -> String showFoo Foo {field = field :: a} = printType @a ++ show field