| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Control.Effect.State
Contents
Description
An effect that adds a mutable, updatable state value to a given computation.
Not all computations require a full-fledged state effect: read-only state is better served by Reader, and append-only state without reads is better served by Writer.
Predefined carriers:
- Control.Carrier.State.Strict, which is strict in its updates; a good default choice.
- Control.Carrier.State.Lazy, which is lazy in its updates. This enables more programs to terminate, such as cyclic computations expressed with
MonadFixor-XRecursiveDo, at the cost of efficiency. - Control.Carrier.State.Church, which uses continuation-passing style rather than tuple-passing; this may increase performance in some circumstances.
- Control.Carrier.State.IORef, which performs its updates impurely via an
IORef, which admits aMonadUnliftIOinstance but precludes rollback during backtracking. - Control.Monad.Trans.RWS.CPS
- Control.Monad.Trans.RWS.Lazy
- Control.Monad.Trans.RWS.Strict
- Control.Monad.Trans.State.Lazy
- Control.Monad.Trans.State.Strict
Since: 0.1.0.0
Synopsis
- data State s (m :: Type -> Type) k where
- get :: forall s (sig :: (Type -> Type) -> Type -> Type) m. Has (State s) sig m => m s
- gets :: forall s (sig :: (Type -> Type) -> Type -> Type) m a. Has (State s) sig m => (s -> a) -> m a
- put :: forall s (sig :: (Type -> Type) -> Type -> Type) m. Has (State s) sig m => s -> m ()
- modify :: forall s (sig :: (Type -> Type) -> Type -> Type) m. Has (State s) sig m => (s -> s) -> m ()
- modifyLazy :: forall s (sig :: (Type -> Type) -> Type -> Type) m. Has (State s) sig m => (s -> s) -> m ()
- state :: forall s (sig :: (Type -> Type) -> Type -> Type) m a. Has (State s) sig m => (s -> (s, a)) -> m a
- class Monad m => Algebra (sig :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) | m -> sig
- type Has (eff :: (Type -> Type) -> Type -> Type) (sig :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) = (Members eff sig, Algebra sig m)
- run :: Identity a -> a
State effect
data State s (m :: Type -> Type) k where Source #
Since: 0.1.0.0
Constructors
| Get :: forall s (m :: Type -> Type). State s m s | |
| Put :: forall s (m :: Type -> Type). s -> State s m () |
Instances
| Algebra sig m => Algebra (State s :+: sig) (StateC s m) Source # | |
| (MonadIO m, Algebra sig m) => Algebra (State s :+: sig) (StateC s m) Source # | |
| Algebra sig m => Algebra (State s :+: sig) (StateC s m) Source # | |
| Algebra sig m => Algebra (State s :+: sig) (StateC s m) Source # | |
| Algebra sig m => Algebra (State s :+: sig) (StateT s m) Source # | |
| Algebra sig m => Algebra (State s :+: sig) (StateT s m) Source # | |
| (Algebra sig m, Monoid w) => Algebra (Reader r :+: (Writer w :+: (State s :+: sig))) (RWST r w s m) Source # | |
| (Algebra sig m, Monoid w) => Algebra (Reader r :+: (Writer w :+: (State s :+: sig))) (RWST r w s m) Source # | |
| (Algebra sig m, Monoid w) => Algebra (Reader r :+: (Writer w :+: (State s :+: sig))) (RWST r w s m) Source # | |
gets :: forall s (sig :: (Type -> Type) -> Type -> Type) m a. Has (State s) sig m => (s -> a) -> m a Source #
put :: forall s (sig :: (Type -> Type) -> Type -> Type) m. Has (State s) sig m => s -> m () Source #
modify :: forall s (sig :: (Type -> Type) -> Type -> Type) m. Has (State s) sig m => (s -> s) -> m () Source #
modifyLazy :: forall s (sig :: (Type -> Type) -> Type -> Type) m. Has (State s) sig m => (s -> s) -> m () Source #
Replace the state value with the result of applying a function to the current state value. This is lazy in the new state; injudicious use of this function may lead to space leaks.
modifyLazyf =get>>=put. f
Since: 0.3.0.0
state :: forall s (sig :: (Type -> Type) -> Type -> Type) m a. Has (State s) sig m => (s -> (s, a)) -> m a Source #
Re-exports
class Monad m => Algebra (sig :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) | m -> sig Source #
The class of carriers (results) for algebras (effect handlers) over signatures (effects), whose actions are given by the alg method.
Since: 1.0.0.0
Minimal complete definition
Instances
| Algebra Choose NonEmpty Source # | |
| Algebra Empty Maybe Source # | |
| Algebra NonDet [] Source # | |
| Algebra sig m => Algebra sig (Choosing m) Source # | |
| Algebra sig m => Algebra sig (Ap m) Source # | This instance permits effectful actions to be lifted into the mappend <$> act1 <*> (mappend <$> act2 <*> act3) is equivalent to getAp (act1 <> act2 <> act3) Since: 1.0.1.0 |
| Algebra sig m => Algebra sig (Alt m) Source # | This instance permits effectful actions to be lifted into the a <|> b <|> c <|> d is equivalent to getAlt (mconcat [a, b, c, d]) Since: 1.0.1.0 |
| Algebra sig m => Algebra sig (IdentityT m) Source # | |
| Algebra (Lift Identity) Identity Source # | |
| Algebra (Lift IO) IO Source # | |
| Algebra (Error e) (Either e) Source # | |
| Monad m => Algebra (Lift m) (LiftC m) Source # | |
| Monoid w => Algebra (Writer w) ((,) w) Source # | |
| Algebra (Reader r) ((->) r) Source # | |
| Algebra sig m => Algebra (Choose :+: sig) (ChooseC m) Source # | |
| Algebra sig m => Algebra (Cull :+: (NonDet :+: sig)) (CullC m) Source # | |
| Algebra sig m => Algebra (Cut :+: (NonDet :+: sig)) (CutC m) Source # | |
| Algebra sig m => Algebra (Empty :+: sig) (EmptyC m) Source # | |
| Algebra sig m => Algebra (Empty :+: sig) (EmptyC m) Source # | |
| Algebra sig m => Algebra (Empty :+: sig) (MaybeT m) Source # | |
| Algebra sig m => Algebra (Fail :+: sig) (FailC m) Source # | |
| Algebra sig m => Algebra (Fresh :+: sig) (FreshC m) Source # | |
| Algebra sig m => Algebra (Fresh :+: sig) (FreshC m) Source # | |
| Algebra sig m => Algebra (NonDet :+: sig) (NonDetC m) Source # | |
| Algebra sig m => Algebra (Trace :+: sig) (TraceC m) Source # | |
| (MonadIO m, Algebra sig m) => Algebra (Trace :+: sig) (TraceC m) Source # | |
| Algebra sig m => Algebra (Trace :+: sig) (TraceC m) Source # | |
| (Algebra sig m, Monoid w) => Algebra (Accum w :+: sig) (AccumC w m) Source # | |
| (Algebra sig m, Semigroup w, MonadIO m) => Algebra (Accum w :+: sig) (AccumC w m) Source # | |
| (Algebra sig m, Monoid w) => Algebra (Accum w :+: sig) (AccumC w m) Source # | |
| (Algebra sig m, Monoid w) => Algebra (Accum w :+: sig) (AccumT w m) Source # | |
| Algebra sig m => Algebra (Error e :+: sig) (ErrorC e m) Source # | |
| Algebra sig m => Algebra (Error e :+: sig) (ErrorC e m) Source # | |
| Algebra sig m => Algebra (Error e :+: sig) (ExceptT e m) Source # | |
| Algebra sig m => Algebra (Reader r :+: sig) (ReaderC r m) Source # | |
| Algebra sig m => Algebra (Reader r :+: sig) (ReaderT r m) Source # | |
| Algebra sig m => Algebra (State s :+: sig) (StateC s m) Source # | |
| (MonadIO m, Algebra sig m) => Algebra (State s :+: sig) (StateC s m) Source # | |
| Algebra sig m => Algebra (State s :+: sig) (StateC s m) Source # | |
| Algebra sig m => Algebra (State s :+: sig) (StateC s m) Source # | |
| Algebra sig m => Algebra (State s :+: sig) (StateT s m) Source # | |
| Algebra sig m => Algebra (State s :+: sig) (StateT s m) Source # | |
| Algebra sig m => Algebra (Throw e :+: sig) (ThrowC e m) Source # | |
| (Algebra sig m, Monoid w) => Algebra (Writer w :+: sig) (WriterC w m) Source # | |
| (Monoid w, Algebra sig m) => Algebra (Writer w :+: sig) (WriterC w m) Source # | |
| (Algebra sig m, Monoid w) => Algebra (Writer w :+: sig) (WriterT w m) Source # | |
| (Algebra sig m, Monoid w) => Algebra (Writer w :+: sig) (WriterT w m) Source # | |
| (Algebra sig m, Monoid w) => Algebra (Writer w :+: sig) (WriterT w m) Source # | |
| (Reifies s (Interpreter eff m), Algebra sig m) => Algebra (eff :+: sig) (InterpretC s eff m) Source # | |
Defined in Control.Carrier.Interpret Methods alg :: forall ctx (n :: Type -> Type) a. Functor ctx => Handler ctx n (InterpretC s eff m) -> (eff :+: sig) n a -> ctx () -> InterpretC s eff m (ctx a) Source # | |
| Algebra (eff :+: sig) (sub m) => Algebra (Labelled label eff :+: sig) (Labelled label sub m) Source # | |
| (Algebra sig m, Monoid w) => Algebra (Reader r :+: (Writer w :+: (State s :+: sig))) (RWST r w s m) Source # | |
| (Algebra sig m, Monoid w) => Algebra (Reader r :+: (Writer w :+: (State s :+: sig))) (RWST r w s m) Source # | |
| (Algebra sig m, Monoid w) => Algebra (Reader r :+: (Writer w :+: (State s :+: sig))) (RWST r w s m) Source # | |
| (LabelledMember label sub sig, Algebra sig m) => Algebra (sub :+: sig) (UnderLabel label sub m) Source # | |
Defined in Control.Effect.Labelled Methods alg :: forall ctx (n :: Type -> Type) a. Functor ctx => Handler ctx n (UnderLabel label sub m) -> (sub :+: sig) n a -> ctx () -> UnderLabel label sub m (ctx a) Source # | |
type Has (eff :: (Type -> Type) -> Type -> Type) (sig :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) = (Members eff sig, Algebra sig m) Source #
m is a carrier for sig containing eff.
Note that if eff is a sum, it will be decomposed into multiple Member constraints. While this technically allows one to combine multiple unrelated effects into a single Has constraint, doing so has two significant drawbacks:
- Due to a problem with recursive type families, this can lead to significantly slower compiles.
- It defeats
ghc’s warnings for redundant constraints, and thus can lead to a proliferation of redundant constraints as code is changed.
Since: 1.0.0.0