| 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.