Cont.MakeMake(T)(M) wraps the monad M into the continuation monad and fix the type of the whole computation to T.t
include Trans.S
with type 'a t := 'a T1(T)(M).t
with type 'a m := 'a T1(T)(M).m
with type 'a e := 'a T1(T)(M).eval lift : 'a T1(T)(M).m -> 'a T1(T)(M).tlifts inner monad into the resulting monad
val run : 'a T1(T)(M).t -> 'a T1(T)(M).eruns the computation
include Monad with type 'a t := 'a T1(T)(M).tval void : 'a T1(T)(M).t -> unit T1(T)(M).tvoid m computes m and discrards the result.
val sequence : unit T1(T)(M).t list -> unit T1(T)(M).tsequence xs computes a sequence of computations xs in the left to right order.
val forever : 'a T1(T)(M).t -> 'b T1(T)(M).tforever xs creates a computationt that never returns.
module Fn : sig ... endVarious function combinators lifted into the Kleisli category.
module Pair : sig ... endThe pair interface lifted into the monad.
module Triple : sig ... endThe triple interface lifted into a monad.
module Lift : sig ... endLifts functions into the monad.
module Exn : sig ... endInteracting between monads and language exceptions
module Collection : sig ... endLifts collection interface into the monad.
module List : Collection.S with type 'a t := 'a listThe Monad.Collection.S interface for lists
module Seq : Collection.S with type 'a t := 'a Core_kernel.Sequence.tThe Monad.Collection.S interface for sequences
include Syntax.S with type 'a t := 'a T1(T)(M).tval (>=>) :
('a -> 'b T1(T)(M).t) ->
('b -> 'c T1(T)(M).t) ->
'a ->
'c T1(T)(M).tf >=> g is fun x -> f x >>= g
val (!!) : 'a -> 'a T1(T)(M).t!!x is return x
val (!$) : ('a -> 'b) -> 'a T1(T)(M).t -> 'b T1(T)(M).t!$f is Lift.unary f
val (!$$) : ('a -> 'b -> 'c) -> 'a T1(T)(M).t -> 'b T1(T)(M).t -> 'c T1(T)(M).t!$$f is Lift.binary f
val (!$$$) :
('a -> 'b -> 'c -> 'd) ->
'a T1(T)(M).t ->
'b T1(T)(M).t ->
'c T1(T)(M).t ->
'd T1(T)(M).t!$$$f is Lift.ternary f
val (!$$$$) :
('a -> 'b -> 'c -> 'd -> 'e) ->
'a T1(T)(M).t ->
'b T1(T)(M).t ->
'c T1(T)(M).t ->
'd T1(T)(M).t ->
'e T1(T)(M).t!$$$$f is Lift.quaternary f
val (!$$$$$) :
('a -> 'b -> 'c -> 'd -> 'e -> 'f) ->
'a T1(T)(M).t ->
'b T1(T)(M).t ->
'c T1(T)(M).t ->
'd T1(T)(M).t ->
'e T1(T)(M).t ->
'f T1(T)(M).t!$$$$$f is Lift.quinary f
include Syntax.Let.S with type 'a t := 'a T1(T)(M).tval let* : 'a T1(T)(M).t -> ('a -> 'b T1(T)(M).t) -> 'b T1(T)(M).tlet* r = f x in b is f x >>= fun r -> b
val and* : 'a T1(T)(M).t -> 'b T1(T)(M).t -> ('a * 'b) T1(T)(M).tmonoidal product
val let+ : 'a T1(T)(M).t -> ('a -> 'b) -> 'b T1(T)(M).tlet+ r = f x in b is f x >>| fun r -> b
val and+ : 'a T1(T)(M).t -> 'b T1(T)(M).t -> ('a * 'b) T1(T)(M).tmonoidal product
include Core_kernel.Monad.S with type 'a t := 'a T1(T)(M).tval (>>=) : 'a T1(T)(M).t -> ('a -> 'b T1(T)(M).t) -> 'b T1(T)(M).tval (>>|) : 'a T1(T)(M).t -> ('a -> 'b) -> 'b T1(T)(M).tmodule Monad_infix : sig ... endval bind : 'a T1(T)(M).t -> f:('a -> 'b T1(T)(M).t) -> 'b T1(T)(M).tval return : 'a -> 'a T1(T)(M).tval map : 'a T1(T)(M).t -> f:('a -> 'b) -> 'b T1(T)(M).tval join : 'a T1(T)(M).t T1(T)(M).t -> 'a T1(T)(M).tval ignore_m : 'a T1(T)(M).t -> unit T1(T)(M).tval all : 'a T1(T)(M).t list -> 'a list T1(T)(M).tval all_unit : unit T1(T)(M).t list -> unit T1(T)(M).tmodule Let_syntax : sig ... endmodule Let : Syntax.Let.S with type 'a t := 'a T1(T)(M).tMonadic operators, see Monad.Syntax.S for more.
module Syntax : Syntax.S with type 'a t := 'a T1(T)(M).tMonadic operators, see Monad.Syntax.S for more.
val call : f:(cc:('a -> _ T1(T)(M).t) -> 'a T1(T)(M).t) -> 'a T1(T)(M).tcall ~f calls f ~cc with the current continuation cc.
The call ~f computation may be computed more than once, i.e., it would be resumed every time the continuation is invoked. The captured continuation represents the computation around the call. Thus invoking this computation will effectively escape the f function (discarding the consequent computations) and continue with a computation that follows the call. The continuation is multi-shot, in the sense that it can be called (resumed) multiple times (or not called at all). Every time it is called, the computation will resume at the same point, thus a computation that contains the call can be seen as a reenterable computation, and the call itself marks the entry point, and the continuation acts like a key that allows any computation that has it to reenter the subroutine at this point.