Module Monad.State

The State Monad.

The state monad denotes a generic effectful computation. Unlike Writer and Reader the State monad can perform arbitrary transformations on state. However, the same as withReader, the State monad comes in two flavors - with a type of state fixed at module level, or with a type of state left to be a type variable. In both cases the type of state remains constant during the computation. There is no difference in implementation, these are just two different interfaces.

type ('a, 'e) storage

an abstract storage

type ('a, 'e) state

an abstract type of stateful computations. The type variable 'a denotes types of values and the type variable 'e denotes a type of the state (aka environment, aka world).

module type S = sig ... end

The State Monad interface with a fixed environment.

module type S2 = sig ... end
module Multi : sig ... end

The Multi State monad.

include S2 with type ('a, 'e) t = ( ( 'a, 'e ) storage, 'e ) state and type 'a m = 'a and type ('a, 'e) e = 'e -> 'a * 'e
include Trans.S1 with type ('a, 'e) t = ( ( 'a, 'e ) storage, 'e ) state with type 'a m = 'a with type ('a, 'e) e = 'e -> 'a * 'e
type ('a, 'e) t = ( ( 'a, 'e ) storage, 'e ) state
type 'a m = 'a
type ('a, 'e) e = 'e -> 'a * 'e
val lift : 'a m -> ( 'a, 'e ) t

lifts inner monad into the resulting monad

val run : ( 'a, 'e ) t -> ( 'a, 'e ) e

runs the computation

include Monad2 with type ('a, 's) t := ( 'a, 's ) t
val void : ( 'a, 'e ) t -> ( unit, 'e ) t

void m computes m and discrards the result.

val sequence : ( unit, 'e ) t list -> ( unit, 'e ) t

sequence xs computes a sequence of computations xs in the left to right order.

val forever : ( 'a, 'e ) t -> ( 'b, 'e ) t

forever xs creates a computationt that never returns.

module Fn : sig ... end

Various function combinators lifted into the Kleisli category.

module Pair : sig ... end

The pair interface lifted into the monad.

module Triple : sig ... end

The triple interface lifted into a monad.

module Lift : sig ... end

Lifts functions into the monad.

module Exn : sig ... end

Interacting between monads and language exceptions

module Collection : sig ... end

Lifts collection interface into the monad.

module List : Collection.S with type 'a t := 'a list

The Monad.Collection.S2 interface for lists

module Seq : Collection.S with type 'a t := 'a Core_kernel.Sequence.t

The Monad.Collection.S2 interface for sequences

include Syntax.S2 with type ('a, 'e) t := ( 'a, 'e ) t
val (>>=) : ( 'a, 'e ) t -> ( 'a -> ( 'b, 'e ) t ) -> ( 'b, 'e ) t

m >>= f is bind m f

val (>>|) : ( 'a, 'e ) t -> ( 'a -> 'b ) -> ( 'b, 'e ) t

m >>= f is map m ~f

val (>=>) : ( 'a -> ( 'b, 'e ) t ) -> ( 'b -> ( 'c, 'e ) t ) -> 'a -> ( 'c, 'e ) t

f >=> g is fun x -> f x >>= g

val (!!) : 'a -> ( 'a, 'e ) t

!!x is return x

val (!$) : ( 'a -> 'b ) -> ( 'a, 'e ) t -> ( 'b, 'e ) t

!$f is Lift.unary f

val (!$$) : ( 'a -> 'b -> 'c ) -> ( 'a, 'e ) t -> ( 'b, 'e ) t -> ( 'c, 'e ) t

!$$f is Lift.binary f

val (!$$$) : ( 'a -> 'b -> 'c -> 'd ) -> ( 'a, 'e ) t -> ( 'b, 'e ) t -> ( 'c, 'e ) t -> ( 'd, 'e ) t

!$$$f is Lift.ternary f

val (!$$$$) : ( 'a -> 'b -> 'c -> 'd -> 'e ) -> ( 'a, 's ) t -> ( 'b, 's ) t -> ( 'c, 's ) t -> ( 'd, 's ) t -> ( 'e, 's ) t

!$$$$f is Lift.quaternary f

val (!$$$$$) : ( 'a -> 'b -> 'c -> 'd -> 'e -> 'f ) -> ( 'a, 's ) t -> ( 'b, 's ) t -> ( 'c, 's ) t -> ( 'd, 's ) t -> ( 'e, 's ) t -> ( 'f, 's ) t

!$$$$$f is Lift.quinary f

include Syntax.Let.S2 with type ('a, 'e) t := ( 'a, 'e ) t
val let* : ( 'a, 'e ) t -> ( 'a -> ( 'b, 'e ) t ) -> ( 'b, 'e ) t

let* r = f x in b is f x >>= fun r -> b

val and* : ( 'a, 'e ) t -> ( 'b, 'e ) t -> ( 'a * 'b, 'e ) t

monoidal product

val let+ : ( 'a, 'e ) t -> ( 'a -> 'b ) -> ( 'b, 'e ) t

let+ r = f x in b is f x >>| fun r -> b

val and+ : ( 'a, 'e ) t -> ( 'b, 'e ) t -> ( 'a * 'b, 'e ) t

monoidal product

include Core_kernel.Monad.S2 with type ('a, 'e) t := ( 'a, 'e ) t
val (>>=) : ( 'a, 'e ) t -> ( 'a -> ( 'b, 'e ) t ) -> ( 'b, 'e ) t
val (>>|) : ( 'a, 'e ) t -> ( 'a -> 'b ) -> ( 'b, 'e ) t
module Let_syntax : sig ... end
module Monad_infix : sig ... end
val bind : ( 'a, 'e ) t -> f:( 'a -> ( 'b, 'e ) t ) -> ( 'b, 'e ) t
val return : 'a -> ( 'a, 'b ) t
val map : ( 'a, 'e ) t -> f:( 'a -> 'b ) -> ( 'b, 'e ) t
val join : ( ( 'a, 'e ) t, 'e ) t -> ( 'a, 'e ) t
val ignore_m : ( 'a, 'e ) t -> ( unit, 'e ) t
val all : ( 'a, 'e ) t list -> ( 'a list, 'e ) t
val all_unit : ( unit, 'e ) t list -> ( unit, 'e ) t
module Let : Syntax.Let.S2 with type ('a, 'e) t := ( 'a, 'e ) t

Monadic Binding Operators.

module Syntax : Syntax.S2 with type ('a, 'e) t := ( 'a, 'e ) t

Monadic operators, see Monad.Syntax.S2 for more.

val put : 's -> ( unit, 's ) t

put s changes the current state to s

val get : unit -> ( 's, 's ) t

get s gets the current state

val gets : ( 's -> 'r ) -> ( 'r, 's ) t

gets p projects the current state with the function p

val update : ( 's -> 's ) -> ( unit, 's ) t

update f updates the current state with the function f

val eval : ( 'a, 'e ) t -> 'e -> 'a

eval m is the same as run m >>| fst, i.e., it runs the computation and returns the computed value.

val exec : ( 'a, 'e ) t -> 'e -> 'e

exec m is the same as run m >>| snd, i.e., it runs the computation and returns the final state.

module T1 (T : Core_kernel.T) (M : Monad) : sig ... end
module T2 (M : Monad) : sig ... end
module Make (T : Core_kernel.T) (M : Monad) : S with type 'a t := 'a T1(T)(M).t and type 'a m := 'a T1(T)(M).m and type 'a e := 'a T1(T)(M).e and type env := T.t
module Make2 (M : Monad) : S2 with type ('a, 'e) t := ( 'a, 'e ) T2(M).t and type 'a m := 'a T2(M).m and type ('a, 'e) e := ( 'a, 'e ) T2(M).e