content: {-# LANGUAGE TemplateHaskell, ExplicitForAll, PolyKinds #-}
  {-# LANGUAGE QuasiQuotes #-}
  
  module Main where
  
  import Language.Haskell.TH (runQ)
  import GHC.Types.Basic
  import GHC.ThToHs
  import GHC.Driver.Session
  import GHC.Core.TyCo.Ppr
  import GHC.Utils.Outputable
  import GHC.Tc.Module
  import GHC.Tc.Utils.Zonk
  import GHC.Utils.Error
  import GHC.Driver.Types
  import GHC
  import qualified GHC.LanguageExtensions as LangExt
  
  import Data.Either (fromRight)
  import Control.Monad.IO.Class (liftIO)
  import System.Environment (getArgs)
  
  main :: IO ()
  main = do
    [libdir] <- getArgs
    runGhc (Just libdir) $ do
      initial_dflags <- getSessionDynFlags
      setSessionDynFlags $ initial_dflags
        `dopt_set` Opt_D_ppr_debug
        `gopt_set` Opt_SuppressUniques
        `gopt_set` Opt_SuppressModulePrefixes
        `gopt_set` Opt_SuppressVarKinds
        `xopt_set` LangExt.KindSignatures
        `xopt_set` LangExt.PolyKinds
        `xopt_set` LangExt.RankNTypes
      hsc_env <- getSession
      let dflags = hsc_dflags hsc_env
      liftIO $ do
        th_t <- runQ [t| forall k {j}.
                         forall (a :: k) (b :: j) ->
                         () |]
        let hs_t = fromRight (error "convertToHsType") $
                   convertToHsType Generated noSrcSpan th_t
        ((warnings, errors), mres) <-
          tcRnType hsc_env SkolemiseFlexi True hs_t
        case mres of
          Nothing -> do
            printBagOfErrors dflags warnings
            printBagOfErrors dflags errors
          Just (t, _) -> do
            putStrLn $ showSDoc dflags (debugPprType t)
  
  