class Monad m => Algebra (sig :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) | m -> sig whereThe class of carriers (results) for algebras (effect handlers) over signatures (effects), whose actions are given by the alg method.
Methods
alg :: Functor ctx => Handler ctx n m -> sig n a -> ctx () -> m (ctx a)Interpret an effect, running any nested actions using a Handler starting from an initial state in
ctx.Instances receive a signature of effects containing actions in
nwhich can be lowered tomusing the passed Handler and initial context. Continuations inncan be handled after mapping into contexts returned from previous actions.For example, considering the Algebra instance for
Either e:instance Algebra (Error e) (Either e) where alg hdl sig ctx = case sig of L (Throw e) -> Left e R (Catch m h) -> either (hdl . (<$ ctx) . h) pure (hdl (m <$ ctx))The Catch case holds actions
m :: n xandh :: e -> n x(for some existentially-quantified typex), and a continuationk :: x -> n a. The algebra must returnm (ctx a), so we have to ultimately use and lower the continuation in order to produce that type. The continuation takes anx, which we can get from either of the actions, after lowering them to values inEither e.To that end, the algebra lifts both the action
mand the result of the error handlerhinto the initial contextctxbefore lowering them withhdl. The continuationkis fmaped into the resulting context and then itself lowered withhdl.By contrast, the Throw case can simply return a value in Left, since there is no continuation to call—it represents an exceptional return—and
Left e :: forall a . Either e a(i.e. Left is polymorphic ina).Instances for monad transformers will most likely handle a signature containing multiple effects, with the tail of the signature handled by whatever monad the transformer wraps. In these cases, the tail of the signature can be delegated most conveniently using thread; see the Algebra instances for
transformerstypes such as ReaderT and ExceptT for details.
Instances53Algebra, …
Algebra Choose NonEmptyDefined in fused-effects-1.1.2.7 · Control.AlgebraAlgebra Empty MaybeDefined in fused-effects-1.1.2.7 · Control.AlgebraAlgebra NonDet []Defined in fused-effects-1.1.2.7 · Control.AlgebraAlgebra sig m => Algebra sig (Choosing m)Defined in fused-effects-1.1.2.7 · Control.Effect.ChooseAlgebra sig m => Algebra sig (Ap m)Defined in fused-effects-1.1.2.7 · Control.AlgebraAlgebra sig m => Algebra sig (Alt m)Defined in fused-effects-1.1.2.7 · Control.AlgebraAlgebra sig m => Algebra sig (IdentityT m)Defined in fused-effects-1.1.2.7 · Control.AlgebraAlgebra (Lift Identity) IdentityDefined in fused-effects-1.1.2.7 · Control.AlgebraAlgebra (Lift IO) IODefined in fused-effects-1.1.2.7 · Control.AlgebraAlgebra (Error e) (Either e)Defined in fused-effects-1.1.2.7 · Control.AlgebraMonad m => Algebra (Lift m) (LiftC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.LiftMonoid w => Algebra (Writer w) (Tuple2 w)Defined in fused-effects-1.1.2.7 · Control.AlgebraAlgebra (Reader r) ((->) r)Defined in fused-effects-1.1.2.7 · Control.AlgebraAlgebra sig m => Algebra (Choose :+: sig) (ChooseC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Choose.ChurchAlgebra sig m => Algebra (Cull :+: (NonDet :+: sig)) (CullC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Cull.ChurchAlgebra sig m => Algebra (Cut :+: (NonDet :+: sig)) (CutC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Cut.ChurchAlgebra sig m => Algebra (Empty :+: sig) (EmptyC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Empty.ChurchAlgebra sig m => Algebra (Empty :+: sig) (EmptyC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Empty.MaybeAlgebra sig m => Algebra (Empty :+: sig) (MaybeT m)Defined in fused-effects-1.1.2.7 · Control.AlgebraAlgebra sig m => Algebra (Fail :+: sig) (FailC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Fail.EitherAlgebra sig m => Algebra (Fresh :+: sig) (FreshC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Fresh.ChurchAlgebra sig m => Algebra (Fresh :+: sig) (FreshC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Fresh.StrictAlgebra sig m => Algebra (NonDet :+: sig) (NonDetC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.NonDet.ChurchAlgebra sig m => Algebra (Trace :+: sig) (TraceC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Trace.IgnoringAlgebra sig m => Algebra (Trace :+: sig) (TraceC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Trace.Returning(MonadIO m, Algebra sig m) => Algebra (Trace :+: sig) (TraceC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Trace.PrintingAlgebra sig m => Algebra (Error e :+: sig) (ErrorC e m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Error.ChurchAlgebra sig m => Algebra (Error e :+: sig) (ErrorC e m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Error.EitherAlgebra sig m => Algebra (Error e :+: sig) (ExceptT e m)Defined in fused-effects-1.1.2.7 · Control.AlgebraAlgebra sig m => Algebra (Reader r :+: sig) (ReaderC r m)Defined in fused-effects-1.1.2.7 · Control.Carrier.ReaderAlgebra sig m => Algebra (Reader r :+: sig) (ReaderT r m)Defined in fused-effects-1.1.2.7 · Control.AlgebraAlgebra sig m => Algebra (State s :+: sig) (StateC s m)Defined in fused-effects-1.1.2.7 · Control.Carrier.State.ChurchAlgebra sig m => Algebra (State s :+: sig) (StateC s m)Defined in fused-effects-1.1.2.7 · Control.Carrier.State.LazyAlgebra sig m => Algebra (State s :+: sig) (StateC s m)Defined in fused-effects-1.1.2.7 · Control.Carrier.State.StrictAlgebra sig m => Algebra (State s :+: sig) (StateT s m)Defined in fused-effects-1.1.2.7 · Control.AlgebraAlgebra sig m => Algebra (State s :+: sig) (StateT s m)Defined in fused-effects-1.1.2.7 · Control.AlgebraAlgebra sig m => Algebra (Throw e :+: sig) (ThrowC e m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Throw.Either(Algebra sig m, Monoid w) => Algebra (Accum w :+: sig) (AccumC w m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Accum.Church(Algebra sig m, Monoid w) => Algebra (Accum w :+: sig) (AccumC w m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Accum.Strict(Algebra sig m, Monoid w) => Algebra (Accum w :+: sig) (AccumT w m)Defined in fused-effects-1.1.2.7 · Control.Algebra(Algebra sig m, Monoid w) => Algebra (Writer w :+: sig) (WriterC w m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Writer.Church(Algebra sig m, Monoid w) => Algebra (Writer w :+: sig) (WriterT w m)Defined in fused-effects-1.1.2.7 · Control.Algebra(Algebra sig m, Monoid w) => Algebra (Writer w :+: sig) (WriterT w m)Defined in fused-effects-1.1.2.7 · Control.Algebra(Algebra sig m, Monoid w) => Algebra (Writer w :+: sig) (WriterT w m)Defined in fused-effects-1.1.2.7 · Control.Algebra(Algebra sig m, Semigroup w, MonadIO m) => Algebra (Accum w :+: sig) (AccumC w m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Accum.IORef(Monoid w, Algebra sig m) => Algebra (Writer w :+: sig) (WriterC w m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Writer.Strict(MonadIO m, Algebra sig m) => Algebra (State s :+: sig) (StateC s m)Defined in fused-effects-1.1.2.7 · Control.Carrier.State.IORef(Reifies s (Interpreter eff m), Algebra sig m) => Algebra (eff :+: sig) (InterpretC s eff m)Defined in fused-effects-1.1.2.7 · Control.Carrier.InterpretAlgebra (eff :+: sig) (sub m) => Algebra (Labelled label eff :+: sig) (Labelled label sub m)Defined in fused-effects-1.1.2.7 · Control.Effect.Labelled(Algebra sig m, Monoid w) => Algebra (Reader r :+: (Writer w :+: (State s :+: sig))) (RWST r w s m)Defined in fused-effects-1.1.2.7 · Control.Algebra(Algebra sig m, Monoid w) => Algebra (Reader r :+: (Writer w :+: (State s :+: sig))) (RWST r w s m)Defined in fused-effects-1.1.2.7 · Control.Algebra(Algebra sig m, Monoid w) => Algebra (Reader r :+: (Writer w :+: (State s :+: sig))) (RWST r w s m)Defined in fused-effects-1.1.2.7 · Control.Algebra(LabelledMember label sub sig, Algebra sig m) => Algebra (sub :+: sig) (UnderLabel label sub m)Defined in fused-effects-1.1.2.7 · Control.Effect.Labelled