package monads

  1. Overview
  2. Docs
Legend:
Library
Module
Module type
Parameter
Class
Class type

Make(T)(M) wraps the monad M into the continuation monad and fix the type of the whole computation to T.t

Parameters

module T : Core_kernel.T
module M : Monad

Signature

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).e
val lift : 'a T1(T)(M).m -> 'a T1(T)(M).t

lifts inner monad into the resulting monad

val run : 'a T1(T)(M).t -> 'a T1(T)(M).e

runs the computation

include Monad with type 'a t := 'a T1(T)(M).t
val void : 'a T1(T)(M).t -> unit T1(T)(M).t

void m computes m and discrards the result.

val sequence : unit T1(T)(M).t list -> unit T1(T)(M).t

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

val forever : 'a T1(T)(M).t -> 'b T1(T)(M).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.S interface for lists

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

The Monad.Collection.S interface for sequences

include Syntax.S with type 'a t := 'a T1(T)(M).t
val (>=>) : ('a -> 'b T1(T)(M).t) -> ('b -> 'c T1(T)(M).t) -> 'a -> 'c T1(T)(M).t

f >=> 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 Core_kernel.Monad.S with type 'a t := 'a T1(T)(M).t
val (>>=) : 'a T1(T)(M).t -> ('a -> 'b T1(T)(M).t) -> 'b T1(T)(M).t

t >>= f returns a computation that sequences the computations represented by two monad elements. The resulting computation first does t to yield a value v, and then runs the computation returned by f v.

val (>>|) : 'a T1(T)(M).t -> ('a -> 'b) -> 'b T1(T)(M).t

t >>| f is t >>= (fun a -> return (f a)).

module Monad_infix : sig ... end
val bind : 'a T1(T)(M).t -> f:('a -> 'b T1(T)(M).t) -> 'b T1(T)(M).t

bind t ~f = t >>= f

val return : 'a -> 'a T1(T)(M).t

return v returns the (trivial) computation that returns v.

val map : 'a T1(T)(M).t -> f:('a -> 'b) -> 'b T1(T)(M).t

map t ~f is t >>| f.

val join : 'a T1(T)(M).t T1(T)(M).t -> 'a T1(T)(M).t

join t is t >>= (fun t' -> t').

val ignore_m : 'a T1(T)(M).t -> unit T1(T)(M).t

ignore_m t is map t ~f:(fun _ -> ()). ignore_m used to be called ignore, but we decided that was a bad name, because it shadowed the widely used Pervasives.ignore. Some monads still do let ignore = ignore_m for historical reasons.

val all : 'a T1(T)(M).t list -> 'a list T1(T)(M).t
val all_unit : unit T1(T)(M).t list -> unit T1(T)(M).t
val all_ignore : unit T1(T)(M).t list -> unit T1(T)(M).t
  • deprecated [since 2018-02] Use [all_unit]
module Let_syntax : sig ... end

These are convenient to have in scope when programming with a monad:

module Syntax : Syntax.S with type 'a t := 'a T1(T)(M).t

Monadic 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).t

call ~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.

OCaml

Innovation. Community. Security.