Modulefused-effects-1.1.2.7Haskell2010
Control.Effect.NonDet
An effect modelling nondeterminism with choice and failure.
Nondeterministic operations are encapsulated by the Alternative class, where empty represents failure and <|> represents choice. This module re-exports the Alternative interface. If you can't or don't want to use Alternative, you can use the empty and <|> operations (from Control.Effect.Empty and Control.Effect.Choose respectively) directly, as the NonDet effect is the composition of Choose and Empty.
Predefined carriers:
Control.Carrier.NonDet.Church, which collects all branches' results using an
Alternativefunctor.If NonDet is the last effect in a stack, it can be interpreted directly into a
[].
- 4 types
- 3 classes
- 5 values
- Packagefused-effects-1.1.2.7
- Exports12
- LanguageHaskell2010
- LicenceBSD-3-Clause
- SourceNonDet.hs
NonDet effects
5 declarationsInstances6Algebra
Algebra Choose NonEmptyDefined in fused-effects-1.1.2.7 · Control.AlgebraAlgebra NonDet []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 (NonDet :+: sig) (NonDetC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.NonDet.Church
Instances8Algebra, …
Algebra 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 (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 (NonDet :+: sig) (NonDetC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.NonDet.Church
Nondeterministically choose an element from a Foldable collection. This can be used to emulate the style of nondeterminism associated with programming in the list monad:
pythagoreanTriples = do
a <- oneOf [1..10]
b <- oneOf [1..10]
c <- oneOf [1..10]
guard (a^2 + b^2 == c^2)
pure (a, b, c)
Map a Foldable collection of values into a nondeterministic computation using the supplied action.
Re-exports
7 declarationsA monoid on applicative functors.
If defined, some and many should be the least solutions of the equations:
Examples
Nothing <|> Just 42Just 42
[1, 2] <|> [3, 4][1,2,3,4]
empty <|> print (2^15)32768
Methods
empty :: f aThe identity of <|>
empty <|> a == a a <|> empty == a(<|>) :: f a -> f a -> f ainfixl 3An associative binary operation
some :: f a -> f [a]One or more.
Examples
Example1 expression some (putStr "la")lalalalalalalalala... * goes on forever *
Example1 expression some Nothingnothing
Example1 expression take 5 <$> some (Just 1)* hangs forever *
Note that this function can be used with Parsers based on Applicatives. In that case
some parserwill attempt to parseparserone or more times until it fails.many :: f a -> f [a]Zero or more.
Examples
Example1 expression many (putStr "la")lalalalalalalalala... * goes on forever *
Example1 expression many NothingJust []
Example1 expression take 5 <$> many (Just 1)* hangs forever *
Note that this function can be used with Parsers based on Applicatives. In that case
many parserwill attempt to parseparserzero or more times until it fails.
Instances67Alternative, …
Alternative ZipListDefined in ghc-internal-10.0.0 · GHC.Internal.Functor.ZipListAlternative MaybeDefined in ghc-internal-10.0.0 · GHC.Internal.BaseAlternative STMDefined in ghc-internal-10.0.0 · GHC.Internal.STMAlternative PDefined in ghc-internal-10.0.0 · GHC.Internal.Text.ParserCombinators.ReadPAlternative ReadPDefined in ghc-internal-10.0.0 · GHC.Internal.Text.ParserCombinators.ReadPAlternative ReadPrecDefined in ghc-internal-10.0.0 · GHC.Internal.Text.ParserCombinators.ReadPrecAlternative IODefined in ghc-internal-10.0.0 · GHC.Internal.BaseAlternative []Defined in ghc-internal-10.0.0 · GHC.Internal.BaseCombines lists by concatenation, starting from the empty list.
Alternative ProxyDefined in ghc-internal-10.0.0 · GHC.Internal.Data.ProxyAlternative U1Defined in ghc-internal-10.0.0 · GHC.Internal.GenericsAlternative (CullC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Cull.ChurchAlternative (CutC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Cut.ChurchAlternative (NonDetC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.NonDet.ChurchAlternative f => Alternative (Lift f)Defined in transformers-0.6.3.0 · Control.Applicative.LiftA combination is Pure only either part is.
Alternative m => Alternative (FreshC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Fresh.ChurchAlternative m => Alternative (LiftC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.LiftAlternative m => Alternative (TraceC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Trace.IgnoringAlternative m => Alternative (TraceC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Trace.PrintingMonadPlus m => Alternative (WrappedMonad m)Defined in base-4.23.0.0 · Control.ApplicativeArrowPlus a => Alternative (ArrowMonad a)Defined in ghc-internal-10.0.0 · GHC.Internal.Control.Arrow(Has Choose sig m, Has Empty sig m) => Alternative (Choosing m)Defined in fused-effects-1.1.2.7 · Control.Effect.Choose(Alternative m, Monad m) => Alternative (FailC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Fail.Either(Alternative m, Monad m) => Alternative (FreshC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Fresh.Strict(Alternative m, Monad m) => Alternative (TraceC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Trace.Returning(Functor m, Monad m) => Alternative (MaybeT m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.MaybeAlternative f => Alternative (Ap f)Defined in ghc-internal-10.0.0 · GHC.Internal.Data.MonoidAlternative f => Alternative (Alt f)Defined in ghc-internal-10.0.0 · GHC.Internal.Data.Semigroup.InternalAlternative f => Alternative (Rec1 f)Defined in ghc-internal-10.0.0 · GHC.Internal.GenericsAlternative f => Alternative (Backwards f)Defined in transformers-0.6.3.0 · Control.Applicative.BackwardsTry alternatives in the same order as
f.Alternative f => Alternative (Reverse f)Defined in transformers-0.6.3.0 · Data.Functor.ReverseDerived instance.
Alternative m => Alternative (AccumC w m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Accum.IORefAlternative m => Alternative (ErrorC e m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Error.ChurchAlternative m => Alternative (ReaderC r m)Defined in fused-effects-1.1.2.7 · Control.Carrier.ReaderAlternative m => Alternative (StateC s m)Defined in fused-effects-1.1.2.7 · Control.Carrier.State.ChurchAlternative m => Alternative (StateC s m)Defined in fused-effects-1.1.2.7 · Control.Carrier.State.IORefAlternative m => Alternative (WriterC w m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Writer.ChurchAlternative m => Alternative (Kleisli m a)Defined in ghc-internal-10.0.0 · GHC.Internal.Control.ArrowAlternative m => Alternative (IdentityT m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.IdentityAlternative m => Alternative (ReaderT r m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.Reader(Alternative m, Monad m) => Alternative (ErrorC e m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Error.EitherErrorC passes Alternative operations along to the underlying monad
m, rather than combining errors à la ExceptT.(Alternative m, Monad m) => Alternative (StateC s m)Defined in fused-effects-1.1.2.7 · Control.Carrier.State.Lazy(Alternative m, Monad m) => Alternative (StateC s m)Defined in fused-effects-1.1.2.7 · Control.Carrier.State.Strict(Alternative m, Monad m) => Alternative (ThrowC e m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Throw.Either(Alternative m, Monad m) => Alternative (WriterC w m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Writer.Strict(Alternative m, Monad m, Monoid w) => Alternative (AccumC w m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Accum.Strict(Alternative m, Monoid w) => Alternative (AccumC w m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Accum.Church(Functor m, Monad m, Monoid e) => Alternative (ExceptT e m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.Except(Functor m, MonadPlus m) => Alternative (SelectT r m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.Select(Functor m, MonadPlus m) => Alternative (StateT s m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.State.Lazy(Functor m, MonadPlus m) => Alternative (StateT s m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.State.Strict(Functor m, MonadPlus m) => Alternative (WriterT w m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.Writer.CPS(Monoid w, Alternative m) => Alternative (WriterT w m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.Writer.Lazy(Monoid w, Alternative m) => Alternative (WriterT w m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.Writer.Strict(Monoid w, Functor m, MonadPlus m) => Alternative (AccumT w m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.Accum(ArrowZero a, ArrowPlus a) => Alternative (WrappedArrow a b)Defined in base-4.23.0.0 · Control.Applicative(Generic1 f, Alternative (Rep1 f)) => Alternative (Generically1 f)Defined in ghc-internal-10.0.0 · GHC.Internal.GenericsAlternative m => Alternative (InterpretC s sig m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Interpret(Alternative f, Alternative g) => Alternative (Product f g)Defined in base-4.23.0.0 · Data.Functor.Product(Alternative f, Alternative g) => Alternative (f :*: g)Defined in ghc-internal-10.0.0 · GHC.Internal.GenericsAlternative (sub m) => Alternative (Labelled label sub m)Defined in fused-effects-1.1.2.7 · Control.Effect.LabelledAlternative f => Alternative (M1 i c f)Defined in ghc-internal-10.0.0 · GHC.Internal.GenericsAlternative m => Alternative (UnderLabel label sub m)Defined in fused-effects-1.1.2.7 · Control.Effect.Labelled(Alternative f, Applicative g) => Alternative (Compose f g)Defined in base-4.23.0.0 · Data.Functor.Compose(Alternative f, Applicative g) => Alternative (f :.: g)Defined in ghc-internal-10.0.0 · GHC.Internal.Generics(Functor m, MonadPlus m) => Alternative (RWST r w s m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.RWS.CPS(Monoid w, Functor m, MonadPlus m) => Alternative (RWST r w s m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.RWS.Lazy(Monoid w, Functor m, MonadPlus m) => Alternative (RWST r w s m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.RWS.Strict
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.
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
type Has (eff :: (Type -> Type) -> Type -> Type) (sig :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) = (Members eff sig, Algebra sig m)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.
Monads that also support choice and failure.
Instances59MonadPlus, …
MonadPlus MaybeDefined in ghc-internal-10.0.0 · GHC.Internal.BaseMonadPlus STMDefined in ghc-internal-10.0.0 · GHC.Internal.STMMonadPlus PDefined in ghc-internal-10.0.0 · GHC.Internal.Text.ParserCombinators.ReadPMonadPlus ReadPDefined in ghc-internal-10.0.0 · GHC.Internal.Text.ParserCombinators.ReadPMonadPlus ReadPrecDefined in ghc-internal-10.0.0 · GHC.Internal.Text.ParserCombinators.ReadPrecMonadPlus IODefined in ghc-internal-10.0.0 · GHC.Internal.BaseMonadPlus []Defined in ghc-internal-10.0.0 · GHC.Internal.BaseCombines lists by concatenation, starting from the empty list.
Monad m => MonadPlus (MaybeT m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.MaybeMonadPlus ProxyDefined in ghc-internal-10.0.0 · GHC.Internal.Data.ProxyMonadPlus U1Defined in ghc-internal-10.0.0 · GHC.Internal.GenericsMonadPlus (CullC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Cull.ChurchMonadPlus (CutC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Cut.ChurchMonadPlus (NonDetC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.NonDet.ChurchMonadPlus m => MonadPlus (LiftC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.LiftMonadPlus m => MonadPlus (TraceC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Trace.IgnoringMonadPlus m => MonadPlus (TraceC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Trace.Printing(Has Choose sig m, Has Empty sig m) => MonadPlus (Choosing m)Defined in fused-effects-1.1.2.7 · Control.Effect.Choose(Alternative m, Monad m) => MonadPlus (FailC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Fail.Either(Alternative m, Monad m) => MonadPlus (FreshC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Fresh.Church(Alternative m, Monad m) => MonadPlus (FreshC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Fresh.Strict(Alternative m, Monad m) => MonadPlus (TraceC m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Trace.Returning(ArrowApply a, ArrowPlus a) => MonadPlus (ArrowMonad a)Defined in ghc-internal-10.0.0 · GHC.Internal.Control.ArrowMonadPlus f => MonadPlus (Ap f)Defined in ghc-internal-10.0.0 · GHC.Internal.Data.MonoidMonadPlus f => MonadPlus (Alt f)Defined in ghc-internal-10.0.0 · GHC.Internal.Data.Semigroup.InternalMonadPlus f => MonadPlus (Rec1 f)Defined in ghc-internal-10.0.0 · GHC.Internal.GenericsMonadPlus m => MonadPlus (Kleisli m a)Defined in ghc-internal-10.0.0 · GHC.Internal.Control.ArrowMonadPlus m => MonadPlus (IdentityT m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.IdentityMonadPlus m => MonadPlus (ReaderT r m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.ReaderMonadPlus m => MonadPlus (SelectT r m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.SelectMonadPlus m => MonadPlus (StateT s m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.State.LazyMonadPlus m => MonadPlus (StateT s m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.State.StrictMonadPlus m => MonadPlus (Reverse m)Defined in transformers-0.6.3.0 · Data.Functor.ReverseDerived instance.
(Alternative m, Monad m) => MonadPlus (AccumC w m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Accum.IORef(Alternative m, Monad m) => MonadPlus (ErrorC e m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Error.Church(Alternative m, Monad m) => MonadPlus (ErrorC e m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Error.Either(Alternative m, Monad m) => MonadPlus (ReaderC r m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Reader(Alternative m, Monad m) => MonadPlus (StateC s m)Defined in fused-effects-1.1.2.7 · Control.Carrier.State.Church(Alternative m, Monad m) => MonadPlus (StateC s m)Defined in fused-effects-1.1.2.7 · Control.Carrier.State.IORef(Alternative m, Monad m) => MonadPlus (StateC s m)Defined in fused-effects-1.1.2.7 · Control.Carrier.State.Lazy(Alternative m, Monad m) => MonadPlus (StateC s m)Defined in fused-effects-1.1.2.7 · Control.Carrier.State.Strict(Alternative m, Monad m) => MonadPlus (ThrowC e m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Throw.Either(Alternative m, Monad m) => MonadPlus (WriterC w m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Writer.Church(Alternative m, Monad m) => MonadPlus (WriterC w m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Writer.Strict(Functor m, MonadPlus m) => MonadPlus (WriterT w m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.Writer.CPS(Monad m, Monoid e) => MonadPlus (ExceptT e m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.Except(MonadPlus m, Monoid w) => MonadPlus (AccumC w m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Accum.Church(MonadPlus m, Monoid w) => MonadPlus (AccumC w m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Accum.Strict(Monoid w, Functor m, MonadPlus m) => MonadPlus (AccumT w m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.Accum(Monoid w, MonadPlus m) => MonadPlus (WriterT w m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.Writer.Lazy(Monoid w, MonadPlus m) => MonadPlus (WriterT w m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.Writer.StrictMonadPlus m => MonadPlus (InterpretC s sig m)Defined in fused-effects-1.1.2.7 · Control.Carrier.Interpret(MonadPlus f, MonadPlus g) => MonadPlus (Product f g)Defined in base-4.23.0.0 · Data.Functor.Product(MonadPlus f, MonadPlus g) => MonadPlus (f :*: g)Defined in ghc-internal-10.0.0 · GHC.Internal.GenericsMonadPlus (sub m) => MonadPlus (Labelled label sub m)Defined in fused-effects-1.1.2.7 · Control.Effect.LabelledMonadPlus f => MonadPlus (M1 i c f)Defined in ghc-internal-10.0.0 · GHC.Internal.GenericsMonadPlus m => MonadPlus (UnderLabel label sub m)Defined in fused-effects-1.1.2.7 · Control.Effect.Labelled(Functor m, MonadPlus m) => MonadPlus (RWST r w s m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.RWS.CPS(Monoid w, MonadPlus m) => MonadPlus (RWST r w s m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.RWS.Lazy(Monoid w, MonadPlus m) => MonadPlus (RWST r w s m)Defined in transformers-0.6.3.0 · Control.Monad.Trans.RWS.Strict
Conditional failure of Alternative computations. Defined by
guard True = pure ()
guard False = empty
Examples
Common uses of guard include conditionally signalling an error in an error monad and conditionally rejecting the current choice in an Alternative-based parser.
As an example of signalling an error in the error monad Maybe,
consider a safe division function safeDiv x y that returns
Nothing when the denominator y is zero and otherwise. For example:Just (x `div`
y)
safeDiv 4 0Nothing
safeDiv 4 2Just 2
A definition of safeDiv using guards, but not guard:
safeDiv :: Int -> Int -> Maybe Int
safeDiv x y | y /= 0 = Just (x `div` y)
| otherwise = Nothing
A definition of safeDiv using guard and Monad do-notation:
safeDiv :: Int -> Int -> Maybe Int
safeDiv x y = do
guard (y /= 0)
return (x `div` y)
One or none.
It is useful for modelling any computation that is allowed to fail.
Examples
Using the Alternative instance of Control.Monad.Except, the following functions:
import Control.Monad.ExceptcanFail = throwError "it failed" :: Except String Intfinal = return 42 :: Except String Int
Can be combined by allowing the first function to fail:
runExcept $ canFail *> finalLeft "it failed"
runExcept $ optional canFail *> finalRight 42
Run an action exhausted of effects to produce its final result value.