A monad containing an environment of type r, output of type w
and an updatable state of type s.
Modulemonads-tf-0.3.0.1GHC2021
Control.Monad.RWS.Strict
Strict RWS monad.
Inspired by the paper /Functional Programming with Overloading and Higher-Order Polymorphism/, Mark P Jones (http://web.cecs.pdx.edu/~mpj/) Advanced School of Functional Programming, 1995.
- 12 types
- 6 classes
- 40 values
- Packagemonads-tf-0.3.0.1
- Exports61
- LanguageGHC2021
- LicenceBSD-3-Clause
- SourceStrict.hs
The RWS monad
6 declarationsUnwrap an RWS computation as a function. (The inverse of rws.)
evalRWS :: RWS r w s aRWS computation to execute
-> rinitial environment
-> sinitial value
-> (a, w)final value and output
Evaluate a computation with the given initial state and environment, returning the final value and output, discarding the final state.
execRWS :: RWS r w s aRWS computation to execute
-> rinitial environment
-> sinitial value
-> (s, w)final state and output
Evaluate a computation with the given initial state and environment, returning the final state and output, discarding the final value.
The RWST monad transformer
5 declarationsA monad transformer adding reading an environment of type r,
collecting an output of type w and updating a state of type s
to an inner monad m.
Instances22MonadTrans, Monad, Functor, MonadFix, MonadFail, Applicative, …
Monoid w => MonadTrans (RWST r w s)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.Strict(Monoid w, Monad m) => Monad (RWST r w s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.StrictFunctor m => Functor (RWST r w s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.Strict(Monoid w, MonadFix m) => MonadFix (RWST r w s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.Strict(Monoid w, MonadFail m) => MonadFail (RWST r w s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.Strict(Monoid w, Functor m, Monad m) => Applicative (RWST r w s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.Strict(Monoid w, Functor m, MonadPlus m) => Alternative (RWST r w s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.Strict(Monoid w, MonadPlus m) => MonadPlus (RWST r w s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.Strict(Monoid w, MonadIO m) => MonadIO (RWST r w s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.StrictContravariant m => Contravariant (RWST r w s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.Strict(Monoid w, MonadCont m) => MonadCont (RWST r w s m)Defined in monads-tf-0.3.0.1 · Control.Monad.Cont.Class(Monoid w, MonadError m) => MonadError (RWST r w s m)Defined in monads-tf-0.3.0.1 · Control.Monad.Except.Class(Monoid w, Monad m) => MonadRWS (RWST r w s m)Defined in monads-tf-0.3.0.1 · Control.Monad.RWS.Class(Monoid w, Monad m) => MonadReader (RWST r w s m)Defined in monads-tf-0.3.0.1 · Control.Monad.Reader.Class(Monad m, Monoid w) => MonadState (RWST r w s m)Defined in monads-tf-0.3.0.1 · Control.Monad.State.Class(Monoid w, Monad m) => MonadWriter (RWST r w s m)Defined in monads-tf-0.3.0.1 · Control.Monad.Writer.ClassGeneric (RWST r w s m a)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.Stricttype Rep (RWST r w s m a) = D1 ('MetaDataDefined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.Strict"RWST"
"Control.Monad.Trans.RWS.Strict"
"transformers-0.6.1.1-a11a"
'True) (C1 ('MetaCons"RWST"
'PrefixI 'True) (S1 ('MetaSel ('Just"runRWST"
) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (r -> s -> m (a, s, w)))))type ErrorType (RWST r w s m) = ErrorType mDefined in monads-tf-0.3.0.1 · Control.Monad.Except.Classtype EnvType (RWST r w s m) = rDefined in monads-tf-0.3.0.1 · Control.Monad.Reader.Classtype StateType (RWST r w s m) = sDefined in monads-tf-0.3.0.1 · Control.Monad.State.Classtype WriterType (RWST r w s m) = wDefined in monads-tf-0.3.0.1 · Control.Monad.Writer.Class
evalRWST Evaluate a computation with the given initial state and environment, returning the final value and output, discarding the final state.
execRWST Evaluate a computation with the given initial state and environment, returning the final state and output, discarding the final value.
Strict Reader-writer-state monads
50 declarationsmodule Control.Monad.RWS.Class
The Monad class defines the basic operations over a monad,
a concept from a branch of mathematics known as category theory.
From the perspective of a Haskell programmer, however, it is best to
think of a monad as an abstract datatype of actions.
Haskell's do expressions provide a convenient syntax for writing
monadic expressions.
Instances of Monad should satisfy the following:
- Left identity
- Right identity
- Associativity
Furthermore, the Monad and Applicative operations should relate as follows:
The above laws imply:
and that pure and (<*>) satisfy the applicative functor laws.
The instances of Monad for GHC.List.List, Maybe and System.IO.IO
defined in the Prelude satisfy these laws.
Methods
(>>=) :: m a -> (a -> m b) -> m binfixl 1Sequentially compose two actions, passing any value produced by the first as an argument to the second.
'
as >>= bs' can be understood as thedoexpressiondo a <- as bs aAn alternative name for this function is 'bind', but some people may refer to it as 'flatMap', which results from it being equivialent to
\x f -> join (fmap f x) :: Monad m => m a -> (a -> m b) -> m bwhich can be seen as mapping a value with
Monad m => m a -> m (m b)and then 'flattening'm (m b)tom busing join.(>>) :: m a -> m b -> m binfixl 1Sequentially compose two actions, discarding any value produced by the first, like sequencing operators (such as the semicolon) in imperative languages.
'
as >> bs' can be understood as thedoexpressiondo as bsor in terms of
as(>>=)as >>= const bsreturn :: a -> m aInject a value into the monadic type. This function should not be different from its default implementation as pure. The justification for the existence of this function is merely historic.
Instances58Monad, …
Monad ComplexDefined in base-4.20.2.0 · Data.ComplexMonad FirstDefined in base-4.20.2.0 · Data.SemigroupMonad LastDefined in base-4.20.2.0 · Data.SemigroupMonad MaxDefined in base-4.20.2.0 · Data.SemigroupMonad MinDefined in base-4.20.2.0 · Data.SemigroupMonad NonEmptyDefined in ghc-internal-9.1003.0 · GHC.Internal.BaseMonad STMDefined in ghc-internal-9.1003.0 · GHC.Internal.Conc.SyncMonad IdentityDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Functor.IdentityMonad FirstDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidMonad LastDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidMonad DownDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.OrdMonad DualDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalMonad ProductDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalMonad SumDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalMonad NoIODefined in ghc-internal-9.1003.0 · GHC.Internal.GHCiMonad Par1Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsMonad MaybeDefined in ghc-internal-9.1003.0 · GHC.Internal.BaseMonad PDefined in ghc-internal-9.1003.0 · GHC.Internal.Text.ParserCombinators.ReadPMonad ReadPDefined in ghc-internal-9.1003.0 · GHC.Internal.Text.ParserCombinators.ReadPMonad ReadPrecDefined in ghc-internal-9.1003.0 · GHC.Internal.Text.ParserCombinators.ReadPrecMonad SoloDefined in ghc-internal-9.1003.0 · GHC.Internal.BaseMonad IODefined in ghc-internal-9.1003.0 · GHC.Internal.BaseMonad []Defined in ghc-internal-9.1003.0 · GHC.Internal.BaseMonad ProxyDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.ProxyMonad U1Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsMonad (ST s)Defined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.ST.Lazy.ImpMonad (Either e)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.EitherMonad (ST s)Defined in ghc-internal-9.1003.0 · GHC.Internal.STMonad m => Monad (WrappedMonad m)Defined in base-4.20.2.0 · Control.ApplicativeMonad m => Monad (MaybeT m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.MaybeMonoid a => Monad (Tuple2 a)Defined in ghc-internal-9.1003.0 · GHC.Internal.BaseArrowApply a => Monad (ArrowMonad a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Control.ArrowMonad f => Monad (Ap f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidMonad f => Monad (Alt f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalMonad f => Monad (Rec1 f)Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsMonad m => Monad (Kleisli m a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Control.ArrowMonad m => Monad (StateT s m)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Functor.UtilsMonad m => Monad (ExceptT e m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.ExceptMonad m => Monad (IdentityT m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.IdentityMonad m => Monad (ReaderT r m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.ReaderMonad m => Monad (SelectT r m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.SelectMonad m => Monad (StateT s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.State.LazyMonad m => Monad (StateT s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.State.StrictMonad m => Monad (WriterT w m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.Writer.CPSMonad m => Monad (Reverse m)Defined in transformers-0.6.1.1 · Data.Functor.ReverseDerived instance.
(Monoid a, Monoid b) => Monad (Tuple3 a b)Defined in ghc-internal-9.1003.0 · GHC.Internal.Base(Monoid w, Functor m, Monad m) => Monad (AccumT w m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.Accum(Monoid w, Monad m) => Monad (WriterT w m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.Writer.Lazy(Monoid w, Monad m) => Monad (WriterT w m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.Writer.StrictMonad (ContT r m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.ContMonad ((->) r)Defined in ghc-internal-9.1003.0 · GHC.Internal.Base(Monad f, Monad g) => Monad (Product f g)Defined in base-4.20.2.0 · Data.Functor.Product(Monad f, Monad g) => Monad (f :*: g)Defined in ghc-internal-9.1003.0 · GHC.Internal.Generics(Monoid a, Monoid b, Monoid c) => Monad (Tuple4 a b c)Defined in ghc-internal-9.1003.0 · GHC.Internal.BaseMonad f => Monad (M1 i c f)Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsMonad m => Monad (RWST r w s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.CPS(Monoid w, Monad m) => Monad (RWST r w s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.Lazy(Monoid w, Monad m) => Monad (RWST r w s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.Strict
Same as >>=, but with the arguments interchanged.
as >>= f == f =<< asEvaluate each monadic action in the structure from left to right,
and ignore the results. For a version that doesn't ignore the
results see Data.Traversable.sequence.
sequence_ is just like sequenceA_, but specialised to monadic actions.
A type f is a Functor if it provides a function fmap which, given any types a and b
lets you apply any function from (a -> b) to turn an f a into an f b, preserving the
structure of f. Furthermore f needs to adhere to the following:
Note, that the second law follows from the free theorem of the type fmap and the first law, so you need only check that the former condition holds. See these articles by School of Haskell or David Luposchainsky for an explanation.
Methods
fmap :: (a -> b) -> f a -> f bfmap is used to apply a function of type
(a -> b)to a value of typef a, where f is a functor, to produce a value of typef b. Note that for any type constructor with more than one parameter (e.g.,Either), only the last type parameter can be modified with fmap (e.g.,bin `Either a b`).Some type constructors with two parameters or more have a
instance that allows both the last and the penultimate parameters to be mapped over.Data.BifunctorExamples
Convert from a
Maybe Intto aMaybe Stringusing show:Example2 expressions fmap show NothingNothingfmap show (Just 3)Just "3"
Convert from an
Either Int Intto anEither Int Stringusing show:Example2 expressions fmap show (Left 17)Left 17fmap show (Right 17)Right "17"
Double each element of a list:
Example1 expression fmap (*2) [1,2,3][2,4,6]
Apply even to the second element of a pair:
Example1 expression fmap even (2,2)(2,True)
It may seem surprising that the function is only applied to the last element of the tuple compared to the list example above which applies it to every element in the list. To understand, remember that tuples are type constructors with multiple type parameters: a tuple of 3 elements
(a,b,c)can also be written(,,) a b cand itsFunctorinstance is defined forFunctor ((,,) a b)(i.e., only the third parameter is free to be mapped over withfmap).It explains why
fmapcan be used with tuples containing values of different types as in the following example:Example1 expression fmap even ("hello", 1.0, 4)("hello",1.0,True)
(<$) :: a -> f b -> f ainfixl 4Replace all locations in the input with the same value. The default definition is
fmap . const, but this may be overridden with a more efficient version.Examples
Perform a computation with Maybe and replace the result with a constant value if it is Just:
Example2 expressions 'a' <$ Just 2Just 'a''a' <$ NothingNothing
Instances88Functor, …
Functor ComplexDefined in base-4.20.2.0 · Data.ComplexFunctor FirstDefined in base-4.20.2.0 · Data.SemigroupFunctor LastDefined in base-4.20.2.0 · Data.SemigroupFunctor MaxDefined in base-4.20.2.0 · Data.SemigroupFunctor MinDefined in base-4.20.2.0 · Data.SemigroupFunctor ArgDescrDefined in base-4.20.2.0 · System.Console.GetOptFunctor ArgOrderDefined in base-4.20.2.0 · System.Console.GetOptFunctor OptDescrDefined in base-4.20.2.0 · System.Console.GetOptFunctor NonEmptyDefined in ghc-internal-9.1003.0 · GHC.Internal.BaseFunctor STMDefined in ghc-internal-9.1003.0 · GHC.Internal.Conc.SyncFunctor HandlerDefined in ghc-internal-9.1003.0 · GHC.Internal.Control.ExceptionFunctor IdentityDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Functor.IdentityFunctor FirstDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidFunctor LastDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidFunctor DownDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.OrdFunctor DualDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalFunctor ProductDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalFunctor SumDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalFunctor ZipListDefined in ghc-internal-9.1003.0 · GHC.Internal.Functor.ZipListFunctor NoIODefined in ghc-internal-9.1003.0 · GHC.Internal.GHCiFunctor Par1Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsFunctor MaybeDefined in ghc-internal-9.1003.0 · GHC.Internal.BaseFunctor PDefined in ghc-internal-9.1003.0 · GHC.Internal.Text.ParserCombinators.ReadPFunctor ReadPDefined in ghc-internal-9.1003.0 · GHC.Internal.Text.ParserCombinators.ReadPFunctor ReadPrecDefined in ghc-internal-9.1003.0 · GHC.Internal.Text.ParserCombinators.ReadPrecFunctor SoloDefined in ghc-internal-9.1003.0 · GHC.Internal.BaseFunctor IODefined in ghc-internal-9.1003.0 · GHC.Internal.BaseFunctor []Defined in ghc-internal-9.1003.0 · GHC.Internal.BaseFunctor ProxyDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.ProxyFunctor U1Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsFunctor V1Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsFunctor (Arg a)Defined in base-4.20.2.0 · Data.SemigroupFunctor (Array i)Defined in ghc-internal-9.1003.0 · GHC.Internal.ArrFunctor (ST s)Defined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.ST.Lazy.ImpFunctor (Either a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.EitherFunctor (StateL s)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Functor.UtilsFunctor (StateR s)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Functor.UtilsFunctor (ST s)Defined in ghc-internal-9.1003.0 · GHC.Internal.STFunctor (Tuple2 a)Defined in ghc-internal-9.1003.0 · GHC.Internal.BaseFunctor f => Functor (Lift f)Defined in transformers-0.6.1.1 · Control.Applicative.LiftFunctor m => Functor (MaybeT m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.MaybeMonad m => Functor (WrappedMonad m)Defined in base-4.20.2.0 · Control.ApplicativeArrow a => Functor (ArrowMonad a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Control.ArrowFunctor (Const m)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Functor.ConstFunctor (URec Char)Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsFunctor (URec Double)Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsFunctor (URec Float)Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsFunctor (URec Int)Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsFunctor (URec Word)Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsFunctor (URec (Ptr ()))Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsFunctor (Tuple3 a b)Defined in ghc-internal-9.1003.0 · GHC.Internal.BaseFunctor (Constant a)Defined in transformers-0.6.1.1 · Data.Functor.ConstantFunctor f => Functor (Ap f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidFunctor f => Functor (Alt f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalFunctor f => Functor (Rec1 f)Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsFunctor f => Functor (Backwards f)Defined in transformers-0.6.1.1 · Control.Applicative.BackwardsDerived instance.
Functor f => Functor (Reverse f)Defined in transformers-0.6.1.1 · Data.Functor.ReverseDerived instance.
Functor m => Functor (Kleisli m a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Control.ArrowFunctor m => Functor (AccumT w m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.AccumFunctor m => Functor (ExceptT e m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.ExceptFunctor m => Functor (IdentityT m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.IdentityFunctor m => Functor (ReaderT r m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.ReaderFunctor m => Functor (SelectT r m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.SelectFunctor m => Functor (StateT s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.State.LazyFunctor m => Functor (StateT s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.State.StrictFunctor m => Functor (WriterT w m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.Writer.CPSFunctor m => Functor (WriterT w m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.Writer.LazyFunctor m => Functor (WriterT w m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.Writer.StrictMonad m => Functor (StateT s m)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Functor.UtilsArrow a => Functor (WrappedArrow a b)Defined in base-4.20.2.0 · Control.Applicative(Generic1 f, Functor (Rep1 f)) => Functor (Generically1 f)Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsFunctor (K1 i c)Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsFunctor (Tuple4 a b c)Defined in ghc-internal-9.1003.0 · GHC.Internal.BaseFunctor (ContT r m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.ContFunctor ((->) r)Defined in ghc-internal-9.1003.0 · GHC.Internal.Base(Functor f, Functor g) => Functor (Product f g)Defined in base-4.20.2.0 · Data.Functor.Product(Functor f, Functor g) => Functor (Sum f g)Defined in base-4.20.2.0 · Data.Functor.Sum(Functor f, Functor g) => Functor (f :*: g)Defined in ghc-internal-9.1003.0 · GHC.Internal.Generics(Functor f, Functor g) => Functor (f :+: g)Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsFunctor (Tuple5 a b c d)Defined in ghc-internal-9.1003.0 · GHC.Internal.BaseFunctor f => Functor (M1 i c f)Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsFunctor m => Functor (RWST r w s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.CPSFunctor m => Functor (RWST r w s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.LazyFunctor m => Functor (RWST r w s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.Strict(Functor f, Functor g) => Functor (Compose f g)Defined in base-4.20.2.0 · Data.Functor.Compose(Functor f, Functor g) => Functor (f :.: g)Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsFunctor (Tuple6 a b c d e)Defined in ghc-internal-9.1003.0 · GHC.Internal.BaseFunctor (Tuple7 a b c d e f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Base
Map each element of a structure to a monadic action, evaluate
these actions from left to right, and collect the results. For
a version that ignores the results see Data.Foldable.mapM_.
Examples
mapM is literally a traverse with a type signature restricted to Monad. Its implementation may be more efficient due to additional power of Monad.
Evaluate each monadic action in the structure from left to
right, and collect the results. For a version that ignores the
results see Data.Foldable.sequence_.
Examples
Basic usage:
The first two examples are instances where the input and and output of sequence are isomorphic.
sequence $ Right [1,2,3,4][Right 1,Right 2,Right 3,Right 4]
sequence $ [Right 1,Right 2,Right 3,Right 4]Right [1,2,3,4]
The following examples demonstrate short circuit behavior for sequence.
sequence $ Left [1,2,3,4]Left [1,2,3,4]
sequence $ [Left 0, Right 1,Right 2,Right 3,Right 4]Left 0
The join function is the conventional monad join operator. It is used to remove one level of monadic structure, projecting its bound argument into the outer level.
'join bss' can be understood as the do expression
do bs <- bss
bs
Examples
join [[1, 2, 3], [4, 5, 6], [7, 8, 9]][1,2,3,4,5,6,7,8,9]
join (Just (Just 3))Just 3
A common use of join is to run an IO computation returned from
an GHC.Conc.STM transaction, since GHC.Conc.STM transactions
can't perform IO directly. Recall that
GHC.Internal.Conc.atomically :: STM a -> IO a
is used to run GHC.Conc.STM transactions atomically. So, by
specializing the types of GHC.Internal.Conc.atomically and join to
GHC.Internal.Conc.atomically :: STM (IO b) -> IO (IO b)
join :: IO (IO b) -> IO b
we can compose them as
join . GHC.Internal.Conc.atomically :: STM (IO b) -> IO b
to run an GHC.Conc.STM transaction and the IO action it
returns.
Monads that also support choice and failure.
Instances32MonadPlus, …
MonadPlus STMDefined in ghc-internal-9.1003.0 · GHC.Internal.Conc.SyncMonadPlus MaybeDefined in ghc-internal-9.1003.0 · GHC.Internal.BaseMonadPlus PDefined in ghc-internal-9.1003.0 · GHC.Internal.Text.ParserCombinators.ReadPMonadPlus ReadPDefined in ghc-internal-9.1003.0 · GHC.Internal.Text.ParserCombinators.ReadPMonadPlus ReadPrecDefined in ghc-internal-9.1003.0 · GHC.Internal.Text.ParserCombinators.ReadPrecMonadPlus IODefined in ghc-internal-9.1003.0 · GHC.Internal.BaseMonadPlus []Defined in ghc-internal-9.1003.0 · GHC.Internal.BaseCombines lists by concatenation, starting from the empty list.
Monad m => MonadPlus (MaybeT m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.MaybeMonadPlus ProxyDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.ProxyMonadPlus U1Defined in ghc-internal-9.1003.0 · GHC.Internal.Generics(ArrowApply a, ArrowPlus a) => MonadPlus (ArrowMonad a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Control.ArrowMonadPlus f => MonadPlus (Ap f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidMonadPlus f => MonadPlus (Alt f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalMonadPlus f => MonadPlus (Rec1 f)Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsMonadPlus m => MonadPlus (Kleisli m a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Control.ArrowMonadPlus m => MonadPlus (IdentityT m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.IdentityMonadPlus m => MonadPlus (ReaderT r m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.ReaderMonadPlus m => MonadPlus (SelectT r m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.SelectMonadPlus m => MonadPlus (StateT s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.State.LazyMonadPlus m => MonadPlus (StateT s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.State.StrictMonadPlus m => MonadPlus (Reverse m)Defined in transformers-0.6.1.1 · Data.Functor.ReverseDerived instance.
(Functor m, MonadPlus m) => MonadPlus (WriterT w m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.Writer.CPS(Monad m, Monoid e) => MonadPlus (ExceptT e m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.Except(Monoid w, Functor m, MonadPlus m) => MonadPlus (AccumT w m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.Accum(Monoid w, MonadPlus m) => MonadPlus (WriterT w m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.Writer.Lazy(Monoid w, MonadPlus m) => MonadPlus (WriterT w m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.Writer.Strict(MonadPlus f, MonadPlus g) => MonadPlus (Product f g)Defined in base-4.20.2.0 · Data.Functor.Product(MonadPlus f, MonadPlus g) => MonadPlus (f :*: g)Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsMonadPlus f => MonadPlus (M1 i c f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Generics(Functor m, MonadPlus m) => MonadPlus (RWST r w s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.CPS(Monoid w, MonadPlus m) => MonadPlus (RWST r w s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.Lazy(Monoid w, MonadPlus m) => MonadPlus (RWST r w s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.Strict
Promote a function to a monad. This is equivalent to fmap but specialised to Monads.
Promote a function to a monad, scanning the monadic arguments from left to right.
Examples
liftM2 (+) [0,1] [0,2][0,2,1,3]
liftM2 (+) (Just 1) NothingNothing
liftM2 (+) (+ 3) (* 2) 518
Promote a function to a monad, scanning the monadic arguments from left to right (cf. liftM2).
Promote a function to a monad, scanning the monadic arguments from left to right (cf. liftM2).
Promote a function to a monad, scanning the monadic arguments from left to right (cf. liftM2).
Conditional execution of Applicative expressions. For example,
Examples
when debug (putStrLn "Debugging")will output the string Debugging if the Boolean value debug
is True, and otherwise do nothing.
putStr "pi:" >> when False (print 3.14159)pi:
When a value is bound in do-notation, the pattern on the left
hand side of <- might not match. In this case, this class
provides a function to recover.
A Monad without a MonadFail instance may only be used in conjunction
with pattern that always match, such as newtypes, tuples, data types with
only a single data constructor, and irrefutable patterns (~pat).
Instances of MonadFail should satisfy the following law: fail s should
be a left zero for >>=,
fail s >>= f = fail s
If your Monad is also MonadPlus, a popular definition is
fail _ = mzero
fail s should be an action that runs in the monad itself, not an
exception (except in instances of MonadIO). In particular,
fail should not be implemented in terms of error.
Instances23MonadFail, …
MonadFail MaybeDefined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FailMonadFail PDefined in ghc-internal-9.1003.0 · GHC.Internal.Text.ParserCombinators.ReadPMonadFail ReadPDefined in ghc-internal-9.1003.0 · GHC.Internal.Text.ParserCombinators.ReadPMonadFail ReadPrecDefined in ghc-internal-9.1003.0 · GHC.Internal.Text.ParserCombinators.ReadPrecMonadFail IODefined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FailMonadFail []Defined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FailMonad m => MonadFail (MaybeT m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.MaybeMonadFail f => MonadFail (Ap f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidMonadFail m => MonadFail (ExceptT e m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.ExceptMonadFail m => MonadFail (IdentityT m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.IdentityMonadFail m => MonadFail (ReaderT r m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.ReaderMonadFail m => MonadFail (SelectT r m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.SelectMonadFail m => MonadFail (StateT s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.State.LazyMonadFail m => MonadFail (StateT s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.State.StrictMonadFail m => MonadFail (WriterT w m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.Writer.CPSMonadFail m => MonadFail (Reverse m)Defined in transformers-0.6.1.1 · Data.Functor.Reverse(Monoid w, MonadFail m) => MonadFail (AccumT w m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.Accum(Monoid w, MonadFail m) => MonadFail (WriterT w m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.Writer.Lazy(Monoid w, MonadFail m) => MonadFail (WriterT w m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.Writer.StrictMonadFail m => MonadFail (ContT r m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.ContMonadFail m => MonadFail (RWST r w s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.CPS(Monoid w, MonadFail m) => MonadFail (RWST r w s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.Lazy(Monoid w, MonadFail m) => MonadFail (RWST r w s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.Strict
void value discards or ignores the result of evaluation, such
as the return value of an System.IO.IO action.
Examples
Replace the contents of a Maybe Int with unit:
void NothingNothing
void (Just 3)Just ()
Replace the contents of an Either Int Int
with unit, resulting in an Either Int :()
void (Left 8675309)Left 8675309
void (Right 8675309)Right ()
Replace every element of a list with unit:
void [1,2,3][(),(),()]
Replace the second element of a pair with unit:
void (1,2)(1,())
Discard the result of an System.IO.IO action:
mapM print [1,2]12[(),()]
void $ mapM print [1,2]12
Strict version of Data.Functor.<$>.
This generalizes the list-based filter function.
runIdentity (filterM (Identity . p) xs) == filter p xsExamples
filterM (\x -> do putStrLn ("Keep: " ++ show x ++ "?") answer <- getLine pure (answer == "y")) [1, 2, 3]Keep: 1?yKeep: 2?nKeep: 3?y[1,3]
filterM (\x -> do putStr (show x) x' <- readLn pure (x == x')) [1, 2, 3]122233[2,3]
The foldM function is analogous to foldl, except that its result is
encapsulated in a monad. Note that foldM works from left-to-right over
the list arguments. This could be an issue where (>>) and the `folded
function' are not commutative.
foldM f a1 [x1, x2, ..., xm]
==
do
a2 <- f a1 x1
a3 <- f a2 x2
...
f am xmIf right-to-left evaluation is required, the input list should be reversed.
Like foldM, but discards the result.
Repeat an action indefinitely.
Examples
A common use of forever is to process input from network sockets,
System.IO.Handles, and channels
(e.g. Control.Concurrent.MVar.MVar and
Chan).
For example, here is how we might implement an echo server, using forever both to listen for client connections on a network socket and to echo client input on client connection handles:
echoServer :: Socket -> IO ()
echoServer socket = forever $ do
client <- accept socket
forkFinally (echo client) (\_ -> hClose client)
where
echo :: Handle -> IO ()
echo client = forever $
hGetLine client >>= hPutStrLn client
Note that "forever" isn't necessarily non-terminating.
If the action is in a MonadPlus and short-circuits after some number of iterations.
then forever actually returns mzero, effectively short-circuiting its caller.
The mapAndUnzipM function maps its first argument over a list, returning the result as a pair of lists. This function is mainly used with complicated data structures or a state monad.
replicateM n act performs the action act n times,
and then returns the list of results.
replicateM n (pure x) == replicate n xExamples
replicateM 3 getLinehiheyahiya["hi","heya","hiya"]
import Control.Monad.StaterunState (replicateM 3 $ state $ \s -> (s, s + 1)) 1([1,2,3],4)
The reverse of when.
Examples
do x <- getLine unless (x == "hi") (putStrLn "hi!")comingupwithexamplesisdifficulthi!
unless (pi > exp 1) NothingJust ()
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 Just (x `div`
y) otherwise. For example:
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)
Monads having fixed points with a 'knot-tying' semantics. Instances of MonadFix should satisfy the following laws:
- Purity
- Left shrinking (or Tightening)
mfix (\x -> a >>= \y -> f x y) = a >>= \y -> mfix (\x -> f x y)- Sliding
mfix (liftM h . f) = liftM h (mfix (f . h)), for strict
h.
- Nesting
This class is used in the translation of the recursive do notation
supported by GHC and Hugs.
Instances41MonadFix, …
MonadFix ComplexDefined in base-4.20.2.0 · Data.ComplexMonadFix FirstDefined in base-4.20.2.0 · Data.SemigroupMonadFix LastDefined in base-4.20.2.0 · Data.SemigroupMonadFix MaxDefined in base-4.20.2.0 · Data.SemigroupMonadFix MinDefined in base-4.20.2.0 · Data.SemigroupMonadFix NonEmptyDefined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixMonadFix IdentityDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Functor.IdentityMonadFix FirstDefined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixMonadFix LastDefined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixMonadFix DownDefined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixMonadFix DualDefined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixMonadFix ProductDefined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixMonadFix SumDefined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixMonadFix Par1Defined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixMonadFix MaybeDefined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixMonadFix SoloDefined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixMonadFix IODefined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixMonadFix []Defined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixMonadFix (ST s)Defined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.ST.Lazy.ImpMonadFix (Either e)Defined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixMonadFix (ST s)Defined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixMonadFix m => MonadFix (MaybeT m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.MaybeMonadFix f => MonadFix (Ap f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixMonadFix f => MonadFix (Alt f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixMonadFix f => MonadFix (Rec1 f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixMonadFix m => MonadFix (ExceptT e m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.ExceptMonadFix m => MonadFix (IdentityT m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.IdentityMonadFix m => MonadFix (ReaderT r m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.ReaderMonadFix m => MonadFix (StateT s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.State.LazyMonadFix m => MonadFix (StateT s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.State.StrictMonadFix m => MonadFix (WriterT w m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.Writer.CPS(Monoid w, Functor m, MonadFix m) => MonadFix (AccumT w m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.Accum(Monoid w, MonadFix m) => MonadFix (WriterT w m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.Writer.Lazy(Monoid w, MonadFix m) => MonadFix (WriterT w m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.Writer.StrictMonadFix ((->) r)Defined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.Fix(MonadFix f, MonadFix g) => MonadFix (Product f g)Defined in base-4.20.2.0 · Data.Functor.Product(MonadFix f, MonadFix g) => MonadFix (f :*: g)Defined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixMonadFix f => MonadFix (M1 i c f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixMonadFix m => MonadFix (RWST r w s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.CPS(Monoid w, MonadFix m) => MonadFix (RWST r w s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.Lazy(Monoid w, MonadFix m) => MonadFix (RWST r w s m)Defined in transformers-0.6.1.1 · Control.Monad.Trans.RWS.Strict
fix f is the least fixed point of the function f,
i.e. the least defined x such that f x = x.
When f is strict, this means that because, by the definition of strictness,
f ⊥ = ⊥ and such the least defined fixed point of any strict function is ⊥.
Examples
We can write the factorial function using direct recursion as
let fac n = if n <= 1 then 1 else n * fac (n-1) in fac 5120
This uses the fact that Haskell’s let introduces recursive bindings. We can
rewrite this definition using fix,
Instead of making a recursive call, we introduce a dummy parameter rec;
when used within fix, this parameter then refers to fix’s argument, hence
the recursion is reintroduced.
fix (\rec n -> if n <= 1 then 1 else n * rec (n-1)) 5120
Using fix, we can implement versions of repeat as fix .
and cycle as (:)fix . (++)
take 10 $ fix (0:)[0,0,0,0,0,0,0,0,0,0]
map (fix (\rec n -> if n < 2 then n else rec (n - 1) + rec (n - 2))) [1..10][1,1,2,3,5,8,13,21,34,55]
Implementation Details
The current implementation of fix uses structural sharing
fix f = let x = f x in xA more straightforward but non-sharing version would look like
fix f = f (fix f)module Control.Monad.Trans
The class of monoids (types with an associative binary operation that has an identity). Instances should satisfy the following:
- Right identity
- Left identity
- Associativity
(
law)
- Concatenation
You can alternatively define mconcat instead of mempty, in which case the laws are:
- Unit
- Multiplication
- Subclass
The method names refer to the monoid of lists under concatenation, but there are many other instances.
Some types can be viewed as a monoid in more than one way,
e.g. both addition and multiplication on numbers.
In such cases we often define newtypes and make those instances
of Monoid, e.g. Data.Semigroup.Sum and Data.Semigroup.Product.
NOTE: Semigroup is a superclass of Monoid since base-4.11.0.0.
Methods
mempty :: aIdentity of mappend
Examples
Example1 expression "Hello world" <> mempty"Hello world"
Example1 expression mempty <> [1, 2, 3][1,2,3]
mappend :: a -> a -> aAn associative operation
NOTE: This method is redundant and has the default implementation
mappend = (<>)since base-4.11.0.0. Should it be implemented manually, since mappend is a synonym for (<>), it is expected that the two functions are defined the same way. In a future GHC release mappend will be removed from Monoid.mconcat :: [a] -> aFold a list using the monoid.
For most types, the default definition for mconcat will be used, but the function is included in the class definition so that an optimized version can be provided for specific types.
Example1 expression mconcat ["Hello", " ", "Haskell", "!"]"Hello Haskell!"
Instances56Monoid, …
Monoid ByteArrayDefined in base-4.20.2.0 · Data.Array.ByteMonoid AllDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalMonoid AnyDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalMonoid EventDefined in ghc-internal-9.1003.0 · GHC.Internal.Event.Internal.TypesMonoid EventLifetimeDefined in ghc-internal-9.1003.0 · GHC.Internal.Event.Internal.TypesMonoid LifetimeDefined in ghc-internal-9.1003.0 · GHC.Internal.Event.Internal.Typesmappendtakes the longer of two lifetimes.Monoid ExceptionContextDefined in ghc-internal-9.1003.0 · GHC.Internal.Exception.ContextMonoid OrderingDefined in ghc-internal-9.1003.0 · GHC.Internal.BaseMonoid ()Defined in ghc-internal-9.1003.0 · GHC.Internal.BaseMonoid (Comparison a)Defined in base-4.20.2.0 · Data.Functor.ContravariantMonoid (Equivalence a)Defined in base-4.20.2.0 · Data.Functor.ContravariantMonoid (Predicate a)Defined in base-4.20.2.0 · Data.Functor.ContravariantMonoid (First a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidMonoid (Last a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidMonoid (Endo a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalMonoid [a]Defined in ghc-internal-9.1003.0 · GHC.Internal.BaseMonoid a => Monoid (STM a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Conc.SyncMonoid a => Monoid (Identity a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Functor.IdentityMonoid a => Monoid (Down a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.OrdMonoid a => Monoid (Dual a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalMonoid a => Monoid (IO a)Defined in ghc-internal-9.1003.0 · GHC.Internal.BaseMonoid a => Monoid (a)Defined in ghc-internal-9.1003.0 · GHC.Internal.BaseMonoid m => Monoid (WrappedMonoid m)Defined in base-4.20.2.0 · Data.SemigroupMonoid p => Monoid (Par1 p)Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsSemigroup a => Monoid (Maybe a)Defined in ghc-internal-9.1003.0 · GHC.Internal.BaseLift a semigroup into Maybe forming a Monoid according to http://en.wikipedia.org/wiki/Monoid: "Any semigroup
Smay be turned into a monoid simply by adjoining an elementenot inSand defininge*e = eande*s = s = s*efor alls ∈ S."Since 4.11.0: constraint on inner
avalue generalised from Monoid to Semigroup.Bits a => Monoid (Ior a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.BitsBits a => Monoid (Xor a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.BitsFiniteBits a => Monoid (And a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.BitsThis constraint is arguably too strong. However, as some types (such as
Natural) have undefined complement, this is the only safe choice.FiniteBits a => Monoid (Iff a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.BitsThis constraint is arguably too strong. However, as some types (such as
Natural) have undefined complement, this is the only safe choice.Num a => Monoid (Product a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalNum a => Monoid (Sum a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalOrd a => Monoid (Max a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Functor.UtilsOrd a => Monoid (Min a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Functor.Utils(Generic a, Monoid (Rep a ())) => Monoid (Generically a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Generics(Ord a, Bounded a) => Monoid (Max a)Defined in base-4.20.2.0 · Data.Semigroup(Ord a, Bounded a) => Monoid (Min a)Defined in base-4.20.2.0 · Data.SemigroupMonoid (Proxy s)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.ProxyMonoid (U1 p)Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsMonoid a => Monoid (Op a b)Defined in base-4.20.2.0 · Data.Functor.Contravariantmempty @(Op a b)without newtypes ismempty @(b->a)=_ -> mempty.mempty :: Op a b mempty = Op _ -> memptyMonoid a => Monoid (ST s a)Defined in ghc-internal-9.1003.0 · GHC.Internal.STMonoid b => Monoid (a -> b)Defined in ghc-internal-9.1003.0 · GHC.Internal.Base(Monoid a, Monoid b) => Monoid (a, b)Defined in ghc-internal-9.1003.0 · GHC.Internal.BaseAlternative f => Monoid (Alt f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalMonoid (f p) => Monoid (Rec1 f p)Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsMonoid a => Monoid (Const a b)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Functor.ConstMonoid a => Monoid (Constant a b)Defined in transformers-0.6.1.1 · Data.Functor.Constant(Applicative f, Monoid a) => Monoid (Ap f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Monoid(Monoid a, Monoid b, Monoid c) => Monoid (a, b, c)Defined in ghc-internal-9.1003.0 · GHC.Internal.BaseMonoid c => Monoid (K1 i c p)Defined in ghc-internal-9.1003.0 · GHC.Internal.Generics(Monoid (f a), Monoid (g a)) => Monoid (Product f g a)Defined in base-4.20.2.0 · Data.Functor.Product(Monoid (f p), Monoid (g p)) => Monoid ((:*:) f g p)Defined in ghc-internal-9.1003.0 · GHC.Internal.Generics(Monoid a, Monoid b, Monoid c, Monoid d) => Monoid (a, b, c, d)Defined in ghc-internal-9.1003.0 · GHC.Internal.BaseMonoid (f (g a)) => Monoid (Compose f g a)Defined in base-4.20.2.0 · Data.Functor.ComposeMonoid (f (g p)) => Monoid ((:.:) f g p)Defined in ghc-internal-9.1003.0 · GHC.Internal.GenericsMonoid (f p) => Monoid (M1 i c f p)Defined in ghc-internal-9.1003.0 · GHC.Internal.Generics(Monoid a, Monoid b, Monoid c, Monoid d, Monoid e) => Monoid (a, b, c, d, e)Defined in ghc-internal-9.1003.0 · GHC.Internal.Base
An associative operation.
Examples
[1,2,3] <> [4,5,6][1,2,3,4,5,6]
Just [1, 2, 3] <> Just [4, 5, 6]Just [1,2,3,4,5,6]
putStr "Hello, " <> putStrLn "World!"Hello, World!
Boolean monoid under disjunction (||).
Any x <> Any y = Any (x || y)Examples
Any True <> mempty <> Any FalseAny {getAny = True}
mconcat (map (\x -> Any (even x)) [2,4,6,7,8])Any {getAny = True}
Any False <> memptyAny {getAny = False}
Instances10Bounded, Eq, Data, Ord, Read, Show, …
Bounded AnyDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalEq AnyDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalData AnyDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.DataOrd AnyDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalRead AnyDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalShow AnyDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalGeneric AnyDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalSemigroup AnyDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalMonoid AnyDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.Internaltype Rep Any = D1 ('MetaDataDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.Internal"Any"
"GHC.Internal.Data.Semigroup.Internal"
"ghc-internal"
'True) (C1 ('MetaCons"Any"
'PrefixI 'True) (S1 ('MetaSel ('Just"getAny"
) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Bool)))
Monoid under multiplication.
Product x <> Product y == Product (x * y)Examples
Product 3 <> Product 4 <> memptyProduct {getProduct = 12}
mconcat [ Product n | n <- [2 .. 10]]Product {getProduct = 3628800}
Constructors
ProductgetProduct :: a
Instances21Monad, Functor, MonadFix, Applicative, Foldable, Traversable, …
Monad ProductDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalFunctor ProductDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalMonadFix ProductDefined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixApplicative ProductDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalFoldable ProductDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.FoldableTraversable ProductDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.TraversableMonadZip ProductDefined in base-4.20.2.0 · Control.Monad.ZipFoldable1 ProductDefined in base-4.20.2.0 · Data.Foldable1Generic1 ProductDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalBounded a => Bounded (Product a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalEq a => Eq (Product a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalData a => Data (Product a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.DataNum a => Num (Product a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalOrd a => Ord (Product a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalRead a => Read (Product a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalShow a => Show (Product a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalGeneric (Product a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalNum a => Semigroup (Product a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalNum a => Monoid (Product a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.Internaltype Rep (Product a) = D1 ('MetaDataDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.Internal"Product"
"GHC.Internal.Data.Semigroup.Internal"
"ghc-internal"
'True) (C1 ('MetaCons"Product"
'PrefixI 'True) (S1 ('MetaSel ('Just"getProduct"
) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a)))type Rep1 Product = D1 ('MetaDataDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.Internal"Product"
"GHC.Internal.Data.Semigroup.Internal"
"ghc-internal"
'True) (C1 ('MetaCons"Product"
'PrefixI 'True) (S1 ('MetaSel ('Just"getProduct"
) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) Par1))
The dual of a Monoid, obtained by swapping the arguments of (<>).
Dual a <> Dual b == Dual (b <> a)Examples
Dual "Hello" <> Dual "World"Dual {getDual = "WorldHello"}
Dual (Dual "Hello") <> Dual (Dual "World")Dual {getDual = Dual {getDual = "HelloWorld"}}
Instances20Monad, Functor, MonadFix, Applicative, Foldable, Traversable, …
Monad DualDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalFunctor DualDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalMonadFix DualDefined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixApplicative DualDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalFoldable DualDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.FoldableTraversable DualDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.TraversableMonadZip DualDefined in base-4.20.2.0 · Control.Monad.ZipFoldable1 DualDefined in base-4.20.2.0 · Data.Foldable1Generic1 DualDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalBounded a => Bounded (Dual a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalEq a => Eq (Dual a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalData a => Data (Dual a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.DataOrd a => Ord (Dual a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalRead a => Read (Dual a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalShow a => Show (Dual a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalGeneric (Dual a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalSemigroup a => Semigroup (Dual a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalMonoid a => Monoid (Dual a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.Internaltype Rep (Dual a) = D1 ('MetaDataDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.Internal"Dual"
"GHC.Internal.Data.Semigroup.Internal"
"ghc-internal"
'True) (C1 ('MetaCons"Dual"
'PrefixI 'True) (S1 ('MetaSel ('Just"getDual"
) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a)))type Rep1 Dual = D1 ('MetaDataDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.Internal"Dual"
"GHC.Internal.Data.Semigroup.Internal"
"ghc-internal"
'True) (C1 ('MetaCons"Dual"
'PrefixI 'True) (S1 ('MetaSel ('Just"getDual"
) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) Par1))
The monoid of endomorphisms under composition.
Endo f <> Endo g == Endo (f . g)Examples
let computation = Endo ("Hello, " ++) <> Endo (++ "!")appEndo computation "Haskell""Hello, Haskell!"
let computation = Endo (*3) <> Endo (+1)appEndo computation 16
Instances4Generic, Semigroup, Monoid, Rep
Generic (Endo a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalSemigroup (Endo a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalMonoid (Endo a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.Internaltype Rep (Endo a) = D1 ('MetaDataDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.Internal"Endo"
"GHC.Internal.Data.Semigroup.Internal"
"ghc-internal"
'True) (C1 ('MetaCons"Endo"
'PrefixI 'True) (S1 ('MetaSel ('Just"appEndo"
) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (a -> a))))
Monoid under addition.
Sum a <> Sum b = Sum (a + b)Examples
Sum 1 <> Sum 2 <> memptySum {getSum = 3}
mconcat [ Sum n | n <- [3 .. 9]]Sum {getSum = 42}
Instances21Monad, Functor, MonadFix, Applicative, Foldable, Traversable, …
Monad SumDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalFunctor SumDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalMonadFix SumDefined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixApplicative SumDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalFoldable SumDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.FoldableTraversable SumDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.TraversableMonadZip SumDefined in base-4.20.2.0 · Control.Monad.ZipFoldable1 SumDefined in base-4.20.2.0 · Data.Foldable1Generic1 SumDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalBounded a => Bounded (Sum a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalEq a => Eq (Sum a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalData a => Data (Sum a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.DataNum a => Num (Sum a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalOrd a => Ord (Sum a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalRead a => Read (Sum a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalShow a => Show (Sum a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalGeneric (Sum a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalNum a => Semigroup (Sum a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalNum a => Monoid (Sum a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.Internaltype Rep (Sum a) = D1 ('MetaDataDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.Internal"Sum"
"GHC.Internal.Data.Semigroup.Internal"
"ghc-internal"
'True) (C1 ('MetaCons"Sum"
'PrefixI 'True) (S1 ('MetaSel ('Just"getSum"
) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a)))type Rep1 Sum = D1 ('MetaDataDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.Internal"Sum"
"GHC.Internal.Data.Semigroup.Internal"
"ghc-internal"
'True) (C1 ('MetaCons"Sum"
'PrefixI 'True) (S1 ('MetaSel ('Just"getSum"
) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) Par1))
Maybe monoid returning the rightmost non-Nothing value.
Last a is isomorphic to Dual (First a), and thus to
Dual (Alt Maybe a)
Data.Semigroup.Last. The former returns the last non-Nothing,
so x <> Data.Monoid.Last Nothing = x. The latter simply returns the last value,
thus x <> Data.Semigroup.Last Nothing = Data.Semigroup.Last Nothing.
Examples
Last (Just "hello") <> Last Nothing <> Last (Just "world")Last {getLast = Just "world"}
Last Nothing <> memptyLast {getLast = Nothing}
Instances18Monad, Functor, MonadFix, Applicative, Foldable, Traversable, …
Monad LastDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidFunctor LastDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidMonadFix LastDefined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixApplicative LastDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidFoldable LastDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.FoldableTraversable LastDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.TraversableMonadZip LastDefined in base-4.20.2.0 · Control.Monad.ZipGeneric1 LastDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidEq a => Eq (Last a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidData a => Data (Last a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.DataOrd a => Ord (Last a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidRead a => Read (Last a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidShow a => Show (Last a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidGeneric (Last a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidSemigroup (Last a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidMonoid (Last a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Monoidtype Rep (Last a) = D1 ('MetaDataDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Monoid"Last"
"GHC.Internal.Data.Monoid"
"ghc-internal"
'True) (C1 ('MetaCons"Last"
'PrefixI 'True) (S1 ('MetaSel ('Just"getLast"
) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Maybe a))))type Rep1 Last = D1 ('MetaDataDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Monoid"Last"
"GHC.Internal.Data.Monoid"
"ghc-internal"
'True) (C1 ('MetaCons"Last"
'PrefixI 'True) (S1 ('MetaSel ('Just"getLast"
) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec1 Maybe)))
Maybe monoid returning the leftmost non-Nothing value.
First a is isomorphic to Alt Maybe a, but precedes it
historically.
Beware that Data.Monoid.First is different from
Data.Semigroup.First. The former returns the first non-Nothing,
so Data.Monoid.First Nothing <> x = x. The latter simply returns the first value,
thus Data.Semigroup.First Nothing <> x = Data.Semigroup.First Nothing.
Examples
First (Just "hello") <> First Nothing <> First (Just "world")First {getFirst = Just "hello"}
First Nothing <> memptyFirst {getFirst = Nothing}
Instances18Monad, Functor, MonadFix, Applicative, Foldable, Traversable, …
Monad FirstDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidFunctor FirstDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidMonadFix FirstDefined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixApplicative FirstDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidFoldable FirstDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.FoldableTraversable FirstDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.TraversableMonadZip FirstDefined in base-4.20.2.0 · Control.Monad.ZipGeneric1 FirstDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidEq a => Eq (First a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidData a => Data (First a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.DataOrd a => Ord (First a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidRead a => Read (First a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidShow a => Show (First a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidGeneric (First a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidSemigroup (First a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidMonoid (First a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Monoidtype Rep (First a) = D1 ('MetaDataDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Monoid"First"
"GHC.Internal.Data.Monoid"
"ghc-internal"
'True) (C1 ('MetaCons"First"
'PrefixI 'True) (S1 ('MetaSel ('Just"getFirst"
) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Maybe a))))type Rep1 First = D1 ('MetaDataDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Monoid"First"
"GHC.Internal.Data.Monoid"
"ghc-internal"
'True) (C1 ('MetaCons"First"
'PrefixI 'True) (S1 ('MetaSel ('Just"getFirst"
) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec1 Maybe)))
Boolean monoid under conjunction (&&).
All x <> All y = All (x && y)Examples
All True <> mempty <> All False)All {getAll = False}
mconcat (map (\x -> All (even x)) [2,4,6,7,8])All {getAll = False}
All True <> memptyAll {getAll = True}
Instances10Bounded, Eq, Data, Ord, Read, Show, …
Bounded AllDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalEq AllDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalData AllDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.DataOrd AllDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalRead AllDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalShow AllDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalGeneric AllDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalSemigroup AllDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalMonoid AllDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.Internaltype Rep All = D1 ('MetaDataDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.Internal"All"
"GHC.Internal.Data.Semigroup.Internal"
"ghc-internal"
'True) (C1 ('MetaCons"All"
'PrefixI 'True) (S1 ('MetaSel ('Just"getAll"
) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Bool)))
This data type witnesses the lifting of a Monoid into an Applicative pointwise.
Examples
Ap (Just [1, 2, 3]) <> Ap NothingAp {getAp = Nothing}
Ap [Sum 10, Sum 20] <> Ap [Sum 1, Sum 2]Ap {getAp = [Sum {getSum = 11},Sum {getSum = 12},Sum {getSum = 21},Sum {getSum = 22}]}
Instances24Generic1, Monad, Functor, MonadFix, MonadFail, Applicative, …
Generic1 (Ap f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidMonad f => Monad (Ap f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidFunctor f => Functor (Ap f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidMonadFix f => MonadFix (Ap f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixMonadFail f => MonadFail (Ap f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidApplicative f => Applicative (Ap f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidFoldable f => Foldable (Ap f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.FoldableTraversable f => Traversable (Ap f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.TraversableAlternative f => Alternative (Ap f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidMonadPlus f => MonadPlus (Ap f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidFoldable1 f => Foldable1 (Ap f)Defined in base-4.20.2.0 · Data.Foldable1(Applicative f, Bounded a) => Bounded (Ap f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidEnum (f a) => Enum (Ap f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidEq (f a) => Eq (Ap f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Monoid(Data (f a), Data a, Typeable f) => Data (Ap f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Data(Applicative f, Num a) => Num (Ap f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidNote that even if the underlying Num and Applicative instances are lawful, for most Applicatives, this instance will not be lawful. If you use this instance with the list Applicative, the following customary laws will not hold:
Commutativity:
Example2 expressions Ap [10,20] + Ap [1,2]Ap {getAp = [11,12,21,22]}Ap [1,2] + Ap [10,20]Ap {getAp = [11,21,12,22]}
Additive inverse:
Example2 expressions Ap [] + negate (Ap [])Ap {getAp = []}fromInteger 0 :: Ap [] IntAp {getAp = [0]}
Distributivity:
Example2 expressions Ap [1,2] * (3 + 4)Ap {getAp = [7,14]}(Ap [1,2] * 3) + (Ap [1,2] * 4)Ap {getAp = [7,11,10,14]}
Ord (f a) => Ord (Ap f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidRead (f a) => Read (Ap f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidShow (f a) => Show (Ap f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidGeneric (Ap f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Monoid(Applicative f, Semigroup a) => Semigroup (Ap f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Monoid(Applicative f, Monoid a) => Monoid (Ap f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Monoidtype Rep (Ap f a) = D1 ('MetaDataDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Monoid"Ap"
"GHC.Internal.Data.Monoid"
"ghc-internal"
'True) (C1 ('MetaCons"Ap"
'PrefixI 'True) (S1 ('MetaSel ('Just"getAp"
) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (f a))))type Rep1 (Ap f) = D1 ('MetaDataDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Monoid"Ap"
"GHC.Internal.Data.Monoid"
"ghc-internal"
'True) (C1 ('MetaCons"Ap"
'PrefixI 'True) (S1 ('MetaSel ('Just"getAp"
) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec1 f)))
Monoid under <|>.
Alt l <> Alt r == Alt (l <|> r)Examples
Alt (Just 12) <> Alt (Just 24)Alt {getAlt = Just 12}
Alt Nothing <> Alt (Just 24)Alt {getAlt = Just 24}
Instances24Generic1, Monad, Functor, MonadFix, Applicative, Foldable, …
Generic1 (Alt f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalMonad f => Monad (Alt f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalFunctor f => Functor (Alt f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalMonadFix f => MonadFix (Alt f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Control.Monad.FixApplicative f => Applicative (Alt f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalFoldable f => Foldable (Alt f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.FoldableTraversable f => Traversable (Alt f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.TraversableAlternative f => Alternative (Alt f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalMonadPlus f => MonadPlus (Alt f)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalMonadZip f => MonadZip (Alt f)Defined in base-4.20.2.0 · Control.Monad.ZipFoldable1 f => Foldable1 (Alt f)Defined in base-4.20.2.0 · Data.Foldable1Contravariant f => Contravariant (Alt f)Defined in base-4.20.2.0 · Data.Functor.ContravariantEnum (f a) => Enum (Alt f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalEq (f a) => Eq (Alt f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.Internal(Data (f a), Data a, Typeable f) => Data (Alt f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.DataNum (f a) => Num (Alt f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalOrd (f a) => Ord (Alt f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalRead (f a) => Read (Alt f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalShow (f a) => Show (Alt f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalGeneric (Alt f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalAlternative f => Semigroup (Alt f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalAlternative f => Monoid (Alt f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.Internaltype Rep (Alt f a) = D1 ('MetaDataDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.Internal"Alt"
"GHC.Internal.Data.Semigroup.Internal"
"ghc-internal"
'True) (C1 ('MetaCons"Alt"
'PrefixI 'True) (S1 ('MetaSel ('Just"getAlt"
) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (f a))))type Rep1 (Alt f) = D1 ('MetaDataDefined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.Internal"Alt"
"GHC.Internal.Data.Semigroup.Internal"
"ghc-internal"
'True) (C1 ('MetaCons"Alt"
'PrefixI 'True) (S1 ('MetaSel ('Just"getAlt"
) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec1 f)))