Module Monad.Cont

The continuation monad.

The continuation monad reifies computations by making them available as first class values. A continuation encapsulates an evaluation context of a host language (OCaml in our case). The continuation monad behaves like it is a function monad, except that it provides the call/cc operator. The call/cc operator calls a user provided function with a current continuaton. This continuation can be stored in a state (i.e., if the Continuation monad is composed with the State monad) and later resumed. It may also be used to implement various control structures, i.e., exceptions or coroutines.

The same as with the state monad we provide two interfaces, one with the type of final result of the computation is fixed on the module level, and another where it is a type variable.

module type S = sig ... end

The unary monad interface

module type S2 = sig ... end

The binary monad interface.

type ('a, 'r) cont

type of continuation monads

include S2 with type ('a, 'r) t = ( 'a, 'r ) cont and type 'a m = 'a and type ('a, 'e) e = ( 'a -> 'e ) -> 'e
include Trans.S1 with type ('a, 'r) t = ( 'a, 'r ) cont with type 'a m = 'a with type ('a, 'e) e = ( 'a -> 'e ) -> 'e
type ('a, 'r) t = ( 'a, 'r ) cont
type 'a m = 'a
type ('a, 'e) e = ( 'a -> 'e ) -> '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, 'e) t := ( 'a, 'e ) 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 call : f:( cc:( 'a -> ( _, 'e ) t ) -> ( 'a, 'e ) t ) -> ( 'a, 'e ) t
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 r := T.t

Make(T)(M) wraps the monad M into the continuation monad and fix the type of the whole computation to 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

Make2(M) wrapes the monad M into the continuation monad.