| Safe Haskell | None | 
|---|---|
| Language | Haskell2010 | 
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
- data ZonkEnv = ZonkEnv {}
 - getZonkEnv :: forall (m :: Type -> Type). Monad m => ZonkT m ZonkEnv
 - data ZonkFlexi
 - initZonkEnv :: MonadIO m => ZonkFlexi -> ZonkT m b -> m b
 - data ZonkT (m :: Type -> Type) a where
 - newtype ZonkBndrT (m :: Type -> Type) a = ZonkBndrT {
- runZonkBndrT' :: forall r. (a -> ZonkT m r) -> ZonkT m r
 
 - runZonkBndrT :: forall (m :: Type -> Type) a. ZonkBndrT m a -> forall r. (a -> ZonkT m r) -> ZonkT m r
 - noBinders :: forall (m :: Type -> Type) a. Monad m => ZonkT m a -> ZonkBndrT m a
 - don'tBind :: forall (m :: Type -> Type) a. Monad m => ZonkBndrT m a -> ZonkT m a
 - setZonkType :: forall (m :: Type -> Type) a. ZonkFlexi -> ZonkT m a -> ZonkT m a
 - extendZonkEnv :: forall (m :: Type -> Type). [Var] -> ZonkBndrT m ()
 - extendIdZonkEnv :: forall (m :: Type -> Type). Var -> ZonkBndrT m ()
 - extendIdZonkEnvRec :: forall (m :: Type -> Type). [Var] -> ZonkBndrT m ()
 - extendTyZonkEnv :: forall (m :: Type -> Type). TyVar -> ZonkBndrT m ()
 
The ZonkEnv
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  | 
The ZonkT and ZonkBndrT zonking monad transformers
data ZonkT (m :: Type -> Type) 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).
newtype ZonkBndrT (m :: Type -> Type) 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
| MonadIO m => MonadFix (ZonkBndrT m) Source # | |
| MonadIO m => MonadIO (ZonkBndrT m) Source # | |
| Applicative (ZonkBndrT m) Source # | |
Defined in GHC.Tc.Zonk.Env Methods pure :: a -> ZonkBndrT m a Source # (<*>) :: ZonkBndrT m (a -> b) -> ZonkBndrT m a -> ZonkBndrT m b Source # liftA2 :: (a -> b -> c) -> ZonkBndrT m a -> ZonkBndrT m b -> ZonkBndrT m c Source # (*>) :: ZonkBndrT m a -> ZonkBndrT m b -> ZonkBndrT m b Source # (<*) :: ZonkBndrT m a -> ZonkBndrT m b -> ZonkBndrT m a Source #  | |
| Functor (ZonkBndrT m) Source # | |
| Monad (ZonkBndrT m) Source # | |
Going between ZonkT and ZonkBndrT
runZonkBndrT :: forall (m :: Type -> Type) a. 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].
don'tBind :: forall (m :: Type -> Type) a. Monad m => ZonkBndrT m a -> ZonkT m a Source #
Run a nested computation that modifies the ZonkEnv,
 without affecting the outer environment.