package monadlib

  1. Overview
  2. Docs

Parameters

module Mon : sig ... end

Signature

include BaseCollectionM with type 'a m = (Mon.t * 'a) C.m

difference p xs ys removes all elements from xs which are less than or equal to some element in ys, according to the partial order p.

include BaseLazyPlus with type 'a m = (Mon.t * 'a) C.m
include BatInterfaces.Monad with type 'a m = (Mon.t * 'a) C.m
type 'a m = (Mon.t * 'a) C.m

The type of a monad producing values of type 'a.

val zero : unit -> 'a m
val lplus : 'a m -> 'a m Lazy.t -> 'a m
val null : 'a m -> bool

null x implies that x is zero. If you do not want to or cannot answer whether a given x is zero, then null x should be false.

val difference : ('a -> 'a -> bool) -> 'a m -> 'a m -> 'a m

difference p xs ys removes all elements from xs which are less than or equal to some element in ys, according to the partial order p.

val unique : ?cmp:('a -> 'a -> bool) -> 'a m -> 'a m

unique eq xs removes duplicates according to the function cmp.

val maxima : ('a -> 'a -> bool) -> 'a m -> 'a m

maxima p xs leaves only the maximal elements according to the partial order p.

val nub : ('a -> 'a -> bool) -> 'a m -> 'a m

nub p xs ys is the same as maxima, but some values might be treated as greater than others depending on their position in the collection.

For instance, with lists, we treat elements that occur earlier in the list as always greater than elements that occur later, otherwise we use p. This is really just an optimisation: in order to retrieve any value from maxima p xs, the maxima function will have had to seen every value. Not so with nub.

include Monad with type 'a m := 'a m
include BatInterfaces.Monad with type 'a m := 'a m
val bind : 'a m -> ('a -> 'b m) -> 'b m

Monadic binding.

bind m f executes first m then f, using the result of m.

include Applicative.Applicative with type 'a m := 'a m
include Applicative.Base with type 'a m := 'a m
val return : 'a -> 'a m
val (<*>) : ('a -> 'b) m -> 'a m -> 'b m
val lift1 : ('a -> 'b) -> 'a m -> 'b m
val lift2 : ('a -> 'b -> 'c) -> 'a m -> 'b m -> 'c m
val lift3 : ('a -> 'b -> 'c -> 'd) -> 'a m -> 'b m -> 'c m -> 'd m
val lift4 : ('a -> 'b -> 'c -> 'd -> 'e) -> 'a m -> 'b m -> 'c m -> 'd m -> 'e m
val (<$>) : ('a -> 'b) -> 'a m -> 'b m

Alias for lift1.

val sequence : 'a m list -> 'a list m
val map_a : ('a -> 'b m) -> 'a list -> 'b list m
val (<*) : 'a m -> 'b m -> 'a m
val (>*) : 'a m -> 'b m -> 'b m
val (>>=) : 'a m -> ('a -> 'b m) -> 'b m
val join : 'a m m -> 'a m
val filter_m : ('a -> bool m) -> 'a list -> 'a list m
val onlyif : bool -> unit m -> unit m
val unless : bool -> unit m -> unit m
val ignore : 'a m -> unit m
val write : Mon.t -> unit m
val run : 'a m -> (Mon.t * 'a) C.m
val cmp_on : ('a -> 'a -> bool) -> (Mon.t * 'a) -> (Mon.t * 'a) -> bool

cmp_on p is the usual product of the ordering on 'a with the ordering on W.t.

val lift : 'a C.m -> 'a m