ghc-lib-9.8.2.20240223: The GHC API, decoupled from GHC versions
Safe HaskellSafe-Inferred
LanguageHaskell2010

GHC.Tc.Zonk.Env

Description

The ZonkEnv zonking environment, and the ZonkT and ZonkBndrT monad transformers, for the final zonking to type in GHC.Tc.Zonk.Type.

See Note [Module structure for zonking] in GHC.Tc.Zonk.Type.

Synopsis

The ZonkEnv

data ZonkEnv Source #

See Note [The ZonkEnv]

Instances

Instances details
Outputable ZonkEnv Source # 
Instance details

Defined in GHC.Tc.Zonk.Env

Methods

ppr :: ZonkEnv -> SDoc #

data ZonkFlexi Source #

How should we handle unfilled unification variables in the zonker?

See Note [Un-unified unification variables]

Constructors

DefaultFlexi

Default unbound unification variables to Any

SkolemiseFlexi

Skolemise unbound unification variables See Note [Zonking the LHS of a RULE]

RuntimeUnkFlexi

Used in the GHCi debugger

NoFlexi

Panic on unfilled meta-variables See Note [Error on unconstrained meta-variables] in GHC.Tc.Utils.TcMType

initZonkEnv :: MonadIO m => ZonkFlexi -> ZonkT m b -> m b Source #

The ZonkT and ZonkBndrT zonking monad transformers

data ZonkT m a where Source #

A reader monad over ZonkEnv, for zonking computations which don't modify the ZonkEnv (e.g. don't bind any variables).

Use ZonkBndrT when you need to modify the ZonkEnv (e.g. to bind a variable).

Bundled Patterns

pattern ZonkT :: forall m a. (ZonkEnv -> m a) -> ZonkT m a 

Instances

Instances details
MonadTrans ZonkT Source # 
Instance details

Defined in GHC.Tc.Zonk.Env

Methods

lift :: Monad m => m a -> ZonkT m a #

MonadFix m => MonadFix (ZonkT m) Source # 
Instance details

Defined in GHC.Tc.Zonk.Env

Methods

mfix :: (a -> ZonkT m a) -> ZonkT m a #

MonadIO m => MonadIO (ZonkT m) Source # 
Instance details

Defined in GHC.Tc.Zonk.Env

Methods

liftIO :: IO a -> ZonkT m a #

Applicative m => Applicative (ZonkT m) Source # 
Instance details

Defined in GHC.Tc.Zonk.Env

Methods

pure :: a -> ZonkT m a #

(<*>) :: ZonkT m (a -> b) -> ZonkT m a -> ZonkT m b #

liftA2 :: (a -> b -> c) -> ZonkT m a -> ZonkT m b -> ZonkT m c #

(*>) :: ZonkT m a -> ZonkT m b -> ZonkT m b #

(<*) :: ZonkT m a -> ZonkT m b -> ZonkT m a #

Functor m => Functor (ZonkT m) Source # 
Instance details

Defined in GHC.Tc.Zonk.Env

Methods

fmap :: (a -> b) -> ZonkT m a -> ZonkT m b #

(<$) :: a -> ZonkT m b -> ZonkT m a #

Monad m => Monad (ZonkT m) Source # 
Instance details

Defined in GHC.Tc.Zonk.Env

Methods

(>>=) :: ZonkT m a -> (a -> ZonkT m b) -> ZonkT m b #

(>>) :: ZonkT m a -> ZonkT m b -> ZonkT m b #

return :: a -> ZonkT m a #

newtype ZonkBndrT m a Source #

Zonk binders, bringing them into scope in the inner computation.

Can be thought of as a state monad transformer StateT ZonkEnv m a, but written in continuation-passing style.

See Note [Continuation-passing style for zonking].

Constructors

ZonkBndrT 

Fields

Instances

Instances details
MonadIO m => MonadFix (ZonkBndrT m) Source # 
Instance details

Defined in GHC.Tc.Zonk.Env

Methods

mfix :: (a -> ZonkBndrT m a) -> ZonkBndrT m a #

MonadIO m => MonadIO (ZonkBndrT m) Source # 
Instance details

Defined in GHC.Tc.Zonk.Env

Methods

liftIO :: IO a -> ZonkBndrT m a #

Applicative (ZonkBndrT m) Source # 
Instance details

Defined in GHC.Tc.Zonk.Env

Methods

pure :: a -> ZonkBndrT m a #

(<*>) :: ZonkBndrT m (a -> b) -> ZonkBndrT m a -> ZonkBndrT m b #

liftA2 :: (a -> b -> c) -> ZonkBndrT m a -> ZonkBndrT m b -> ZonkBndrT m c #

(*>) :: ZonkBndrT m a -> ZonkBndrT m b -> ZonkBndrT m b #

(<*) :: ZonkBndrT m a -> ZonkBndrT m b -> ZonkBndrT m a #

Functor (ZonkBndrT m) Source # 
Instance details

Defined in GHC.Tc.Zonk.Env

Methods

fmap :: (a -> b) -> ZonkBndrT m a -> ZonkBndrT m b #

(<$) :: a -> ZonkBndrT m b -> ZonkBndrT m a #

Monad (ZonkBndrT m) Source # 
Instance details

Defined in GHC.Tc.Zonk.Env

Methods

(>>=) :: ZonkBndrT m a -> (a -> ZonkBndrT m b) -> ZonkBndrT m b #

(>>) :: ZonkBndrT m a -> ZonkBndrT m b -> ZonkBndrT m b #

return :: a -> ZonkBndrT m a #

Going between ZonkT and ZonkBndrT

runZonkBndrT :: ZonkBndrT m a -> forall r. (a -> ZonkT m r) -> ZonkT m r Source #

Zonk some binders and run the continuation.

Example:

zonk (ForAllTy (Bndr tv vis) body_ty)
 = runZonkBndrT (zonkTyBndrX tv) $ \ tv' ->
   do { body_ty' <- zonkTcTypeToTypeX body_ty
      ; return (ForAllTy (Bndr tv' vis) body_ty') }

See Note [Continuation-passing style for zonking].

noBinders :: Monad m => ZonkT m a -> ZonkBndrT m a Source #

Embed a computation that doesn't modify the ZonkEnv into ZonkBndrT.

don'tBind :: Monad m => ZonkBndrT m a -> ZonkT m a Source #

Run a nested computation that modifies the ZonkEnv, without affecting the outer environment.

Modifying and extending the ZonkEnv in ZonkBndrT

extendIdZonkEnvRec :: [Var] -> ZonkBndrT m () Source #

Extend the knot-tied environment.