Module Base__List
Immutable, singly-linked lists, giving fast access to the front of the list, and slow (i.e., O(n)) access to the back of the list. The comparison functions on lists are lexicographic.
val compare : ('a -> 'a -> int) -> 'a t -> 'a t -> int
val hash_fold_t : (Base.Hash.state -> 'a -> Base.Hash.state) -> Base.Hash.state -> 'a t -> Base.Hash.state
include Base.Sexpable.S1 with type 'a t := 'a t
val t_of_sexp : (Base.Sexp.t -> 'a) -> Base.Sexp.t -> 'a t
val sexp_of_t : ('a -> Base.Sexp.t) -> 'a t -> Base.Sexp.t
include Base.Container.S1 with type 'a t := 'a t
val mem : 'a t -> 'a -> equal:('a -> 'a -> bool) -> bool
Checks whether the provided element is there, using
equal
.
val length : 'a t -> int
val is_empty : 'a t -> bool
val iter : 'a t -> f:('a -> unit) -> unit
val fold : 'a t -> init:'accum -> f:('accum -> 'a -> 'accum) -> 'accum
fold t ~init ~f
returnsf (... f (f (f init e1) e2) e3 ...) en
, wheree1..en
are the elements oft
val fold_result : 'a t -> init:'accum -> f:('accum -> 'a -> ('accum, 'e) Base.Result.t) -> ('accum, 'e) Base.Result.t
fold_result t ~init ~f
is a short-circuiting version offold
that runs in theResult
monad. Iff
returns anError _
, that value is returned without any additional invocations off
.
val fold_until : 'a t -> init:'accum -> f:('accum -> 'a -> ('accum, 'final) Base__.Container_intf.Continue_or_stop.t) -> finish:('accum -> 'final) -> 'final
fold_until t ~init ~f ~finish
is a short-circuiting version offold
. Iff
returnsStop _
the computation ceases and results in that value. Iff
returnsContinue _
, the fold will proceed. Iff
never returnsStop _
, the final result is computed byfinish
.Example:
type maybe_negative = | Found_negative of int | All_nonnegative of { sum : int } (** [first_neg_or_sum list] returns the first negative number in [list], if any, otherwise returns the sum of the list. *) let first_neg_or_sum = List.fold_until ~init:0 ~f:(fun sum x -> if x < 0 then Stop (Found_negative x) else Continue (sum + x)) ~finish:(fun sum -> All_nonnegative { sum }) ;; let x = first_neg_or_sum [1; 2; 3; 4; 5] val x : maybe_negative = All_nonnegative {sum = 15} let y = first_neg_or_sum [1; 2; -3; 4; 5] val y : maybe_negative = Found_negative -3
val exists : 'a t -> f:('a -> bool) -> bool
Returns
true
if and only if there exists an element for which the provided function evaluates totrue
. This is a short-circuiting operation.
val for_all : 'a t -> f:('a -> bool) -> bool
Returns
true
if and only if the provided function evaluates totrue
for all elements. This is a short-circuiting operation.
val count : 'a t -> f:('a -> bool) -> int
Returns the number of elements for which the provided function evaluates to true.
val sum : (module Base__.Container_intf.Summable with type t = 'sum) -> 'a t -> f:('a -> 'sum) -> 'sum
Returns the sum of
f i
for alli
in the container.
val find : 'a t -> f:('a -> bool) -> 'a option
Returns as an
option
the first element for whichf
evaluates to true.
val find_map : 'a t -> f:('a -> 'b option) -> 'b option
Returns the first evaluation of
f
that returnsSome
, and returnsNone
if there is no such element.
val to_list : 'a t -> 'a list
val to_array : 'a t -> 'a array
val min_elt : 'a t -> compare:('a -> 'a -> int) -> 'a option
Returns a minimum (resp maximum) element from the collection using the provided
compare
function, orNone
if the collection is empty. In case of a tie, the first element encountered while traversing the collection is returned. The implementation usesfold
so it has the same complexity asfold
.
val max_elt : 'a t -> compare:('a -> 'a -> int) -> 'a option
include Base__.Invariant_intf.S1 with type 'a t := 'a t
val invariant : 'a Base__.Invariant_intf.inv -> 'a t Base__.Invariant_intf.inv
include Base.Monad.S with type 'a t := 'a t
include Base__.Monad_intf.S_without_syntax with type 'a t := 'a t
module Monad_infix : Base__.Monad_intf.Infix with type 'a t := 'a t
val return : 'a -> 'a t
return v
returns the (trivial) computation that returns v.
module Or_unequal_lengths : sig ... end
Or_unequal_lengths
is used for functions that take multiple lists and that only make sense if all the lists have the same length, e.g.,iter2
,map3
. Such functions check the list lengths prior to doing anything else, and returnUnequal_lengths
if not all the lists have the same length.
val of_list : 'a t -> 'a t
of_list
is the identity function. It is useful so that theList
module matches the same signature that other container modules do, namely:val of_list : 'a List.t -> 'a t
val nth : 'a t -> int -> 'a option
val nth_exn : 'a t -> int -> 'a
Return the
n
-th element of the given list. The first element (head of the list) is at position 0. Raise if the list is too short orn
is negative.
val rev_append : 'a t -> 'a t -> 'a t
rev_append l1 l2
reversesl1
and concatenates it tol2
. This is equivalent to(
List
.revl1) @ l2
, butrev_append
is more efficient.
val unordered_append : 'a t -> 'a t -> 'a t
unordered_append l1 l2
has the same elements asl1 @ l2
, but in some unspecified order. Generally takes time proportional to length of first list, but is O(1) if either list is empty.
val rev_map : 'a t -> f:('a -> 'b) -> 'b t
rev_map l ~f
gives the same result asList
.rev(
ListLabels
.mapf l)
, but is more efficient.
val iter2_exn : 'a t -> 'b t -> f:('a -> 'b -> unit) -> unit
iter2 [a1; ...; an] [b1; ...; bn] ~f
calls in turnf a1 b1; ...; f an bn
. The exn version will raise if the two lists have different lengths.
val iter2 : 'a t -> 'b t -> f:('a -> 'b -> unit) -> unit Or_unequal_lengths.t
val rev_map2_exn : 'a t -> 'b t -> f:('a -> 'b -> 'c) -> 'c t
rev_map2_exn l1 l2 ~f
gives the same result asList.rev (List.map2_exn l1 l2 ~f)
, but is more efficient.
val rev_map2 : 'a t -> 'b t -> f:('a -> 'b -> 'c) -> 'c t Or_unequal_lengths.t
val fold2_exn : 'a t -> 'b t -> init:'c -> f:('c -> 'a -> 'b -> 'c) -> 'c
fold2 ~f ~init:a [b1; ...; bn] [c1; ...; cn]
isf (... (f (f a b1 c1) b2 c2) ...) bn cn
. The exn version will raise if the two lists have different lengths.
val fold2 : 'a t -> 'b t -> init:'c -> f:('c -> 'a -> 'b -> 'c) -> 'c Or_unequal_lengths.t
val for_alli : 'a t -> f:(int -> 'a -> bool) -> bool
Like
List
.for_all, but passes the index as an argument.
val for_all2_exn : 'a t -> 'b t -> f:('a -> 'b -> bool) -> bool
Like
List
.for_all, but for a two-argument predicate. The exn version will raise if the two lists have different lengths.
val for_all2 : 'a t -> 'b t -> f:('a -> 'b -> bool) -> bool Or_unequal_lengths.t
val existsi : 'a t -> f:(int -> 'a -> bool) -> bool
Like
List
.exists, but passes the index as an argument.
val exists2_exn : 'a t -> 'b t -> f:('a -> 'b -> bool) -> bool
Like
List
.exists, but for a two-argument predicate. The exn version will raise if the two lists have different lengths.
val exists2 : 'a t -> 'b t -> f:('a -> 'b -> bool) -> bool Or_unequal_lengths.t
val filter : 'a t -> f:('a -> bool) -> 'a t
filter l ~f
returns all the elements of the listl
that satisfy the predicatef
. The order of the elements in the input list is preserved.
val rev_filter : 'a t -> f:('a -> bool) -> 'a t
Like
filter
, but reverses the order of the input list.
val filteri : 'a t -> f:(int -> 'a -> bool) -> 'a t
val partition_map : 'a t -> f:('a -> [ `Fst of 'b | `Snd of 'c ]) -> 'b t * 'c t
partition_map t ~f
partitionst
according tof
.
val partition3_map : 'a t -> f:('a -> [ `Fst of 'b | `Snd of 'c | `Trd of 'd ]) -> 'b t * 'c t * 'd t
val partition_tf : 'a t -> f:('a -> bool) -> 'a t * 'a t
partition_tf l ~f
returns a pair of lists(l1, l2)
, wherel1
is the list of all the elements ofl
that satisfy the predicatep
, andl2
is the list of all the elements ofl
that do not satisfyp
. The order of the elements in the input list is preserved. The "tf" suffix is mnemonic to remind readers at a call that the result is (trues, falses).
val partition_result : ('ok, 'error) Base.Result.t t -> 'ok t * 'error t
partition_result l
returns a pair of lists(l1, l2)
, wherel1
is the list of allOk
elements inl
andl2
is the list of allError
elements. The order of elements in the input list is preserved.
val split_n : 'a t -> int -> 'a t * 'a t
split_n [e1; ...; em] n
is([e1; ...; en], [en+1; ...; em])
.- If
n > m
,([e1; ...; em], [])
is returned. - If
n < 0
,([], [e1; ...; em])
is returned.
- If
val sort : 'a t -> compare:('a -> 'a -> int) -> 'a t
Sort a list in increasing order according to a comparison function. The comparison function must return 0 if its arguments compare as equal, a positive integer if the first is greater, and a negative integer if the first is smaller (see
Array.sort
for a complete specification). For example,Poly
.compare is a suitable comparison function.The current implementation uses Merge Sort. It runs in linear heap space and logarithmic stack space.
Presently, the sort is stable, meaning that two equal elements in the input will be in the same order in the output.
val merge : 'a t -> 'a t -> compare:('a -> 'a -> int) -> 'a t
Merges two lists: assuming that
l1
andl2
are sorted according to the comparison functioncompare
,merge compare l1 l2
will return a sorted list containing all the elements ofl1
andl2
. If several elements compare equal, the elements ofl1
will be before the elements ofl2
.
val hd : 'a t -> 'a option
val tl : 'a t -> 'a t option
val hd_exn : 'a t -> 'a
Returns the first element of the given list. Raises if the list is empty.
val tl_exn : 'a t -> 'a t
Returns the given list without its first element. Raises if the list is empty.
val findi : 'a t -> f:(int -> 'a -> bool) -> (int * 'a) option
val find_exn : 'a t -> f:('a -> bool) -> 'a
find_exn t ~f
returns the first element oft
that satisfiesf
. It raisesCaml.Not_found
orNot_found_s
if there is no such element.
val find_map_exn : 'a t -> f:('a -> 'b option) -> 'b
Returns the first evaluation of
f
that returnsSome
. RaisesCaml.Not_found
orNot_found_s
iff
always returnsNone
.
val find_mapi : 'a t -> f:(int -> 'a -> 'b option) -> 'b option
val find_mapi_exn : 'a t -> f:(int -> 'a -> 'b option) -> 'b
val append : 'a t -> 'a t -> 'a t
E.g.,
append [1; 2] [3; 4; 5]
is[1; 2; 3; 4; 5]
val map : 'a t -> f:('a -> 'b) -> 'b t
map f [a1; ...; an]
applies functionf
toa1
,a2
, ...,an
, in order, and builds the list[f a1; ...; f an]
with the results returned byf
.
val folding_map : 'a t -> init:'b -> f:('b -> 'a -> 'b * 'c) -> 'c t
val folding_mapi : 'a t -> init:'b -> f:(int -> 'b -> 'a -> 'b * 'c) -> 'c t
val fold_map : 'a t -> init:'b -> f:('b -> 'a -> 'b * 'c) -> 'b * 'c t
val fold_mapi : 'a t -> init:'b -> f:(int -> 'b -> 'a -> 'b * 'c) -> 'b * 'c t
val concat_map : 'a t -> f:('a -> 'b t) -> 'b t
concat_map t ~f
isconcat (map t ~f)
, except that there is no guarantee about the order in whichf
is applied to the elements oft
.
val concat_mapi : 'a t -> f:(int -> 'a -> 'b t) -> 'b t
concat_mapi t ~f
is like concat_map, but passes the index as an argument
val map2_exn : 'a t -> 'b t -> f:('a -> 'b -> 'c) -> 'c t
map2 [a1; ...; an] [b1; ...; bn] ~f
is[f a1 b1; ...; f an bn]
. The exn version will raise if the two lists have different lengths.
val map2 : 'a t -> 'b t -> f:('a -> 'b -> 'c) -> 'c t Or_unequal_lengths.t
val rev_map3_exn : 'a t -> 'b t -> 'c t -> f:('a -> 'b -> 'c -> 'd) -> 'd t
val rev_map3 : 'a t -> 'b t -> 'c t -> f:('a -> 'b -> 'c -> 'd) -> 'd t Or_unequal_lengths.t
val map3_exn : 'a t -> 'b t -> 'c t -> f:('a -> 'b -> 'c -> 'd) -> 'd t
val map3 : 'a t -> 'b t -> 'c t -> f:('a -> 'b -> 'c -> 'd) -> 'd t Or_unequal_lengths.t
val rev_map_append : 'a t -> 'b t -> f:('a -> 'b) -> 'b t
rev_map_append l1 l2 ~f
reversesl1
mappingf
over each element, and appends the result to the front ofl2
.
val fold_right : 'a t -> f:('a -> 'b -> 'b) -> init:'b -> 'b
fold_right [a1; ...; an] ~f ~init:b
isf a1 (f a2 (... (f an b) ...))
.
val fold_left : 'a t -> init:'b -> f:('b -> 'a -> 'b) -> 'b
fold_left
is the same asContainer
.S1.fold, and one should always usefold
rather thanfold_left
, except in functors that are parameterized over a more general signature where this equivalence does not hold.
val zip : 'a t -> 'b t -> ('a * 'b) t Or_unequal_lengths.t
val zip_exn : 'a t -> 'b t -> ('a * 'b) t
val mapi : 'a t -> f:(int -> 'a -> 'b) -> 'b t
mapi
is just like map, but it also passes in the index of each element as the first argument to the mapped function. Tail-recursive.
val rev_mapi : 'a t -> f:(int -> 'a -> 'b) -> 'b t
val iteri : 'a t -> f:(int -> 'a -> unit) -> unit
iteri
is just likeiter
, but it also passes in the index of each element as the first argument to the iter'd function. Tail-recursive.
val foldi : 'a t -> init:'b -> f:(int -> 'b -> 'a -> 'b) -> 'b
foldi
is just likefold
, but it also passes in the index of each element as the first argument to the folded function. Tail-recursive.
val reduce_exn : 'a t -> f:('a -> 'a -> 'a) -> 'a
reduce_exn [a1; ...; an] ~f
isf (... (f (f a1 a2) a3) ...) an
. It fails on the empty list. Tail recursive.
val reduce : 'a t -> f:('a -> 'a -> 'a) -> 'a option
val reduce_balanced : 'a t -> f:('a -> 'a -> 'a) -> 'a option
reduce_balanced
returns the same value asreduce
whenf
is associative, but differs in that the tree of nested applications off
has logarithmic depth.This is useful when your
'a
grows in size as you reduce it andf
becomes more expensive with bigger inputs. For example,reduce_balanced ~f:(^)
takesn*log(n)
time, whilereduce ~f:(^)
takes quadratic time.
val reduce_balanced_exn : 'a t -> f:('a -> 'a -> 'a) -> 'a
val group : 'a t -> break:('a -> 'a -> bool) -> 'a t t
group l ~break
returns a list of lists (i.e., groups) whose concatenation is equal to the original list. Each group is broken wherebreak
returns true on a pair of successive elements.Example:
group ~break:(<>) ['M';'i';'s';'s';'i';'s';'s';'i';'p';'p';'i'] -> [['M'];['i'];['s';'s'];['i'];['s';'s'];['i'];['p';'p'];['i']]
val groupi : 'a t -> break:(int -> 'a -> 'a -> bool) -> 'a t t
This is just like
group
, except that you get the index in the original list of the current element along with the two elements.Example, group the chars of
"Mississippi"
into triples:groupi ~break:(fun i _ _ -> i mod 3 = 0) ['M';'i';'s';'s';'i';'s';'s';'i';'p';'p';'i'] -> [['M'; 'i'; 's']; ['s'; 'i'; 's']; ['s'; 'i'; 'p']; ['p'; 'i']]
val chunks_of : 'a t -> length:int -> 'a t t
chunks_of l ~length
returns a list of lists whose concatenation is equal to the original list. Every list haslength
elements, except for possibly the last list, which may have fewer.chunks_of
raises iflength <= 0
.
val last : 'a t -> 'a option
The final element of a list. The
_exn
version raises on the empty list.
val last_exn : 'a t -> 'a
val is_prefix : 'a t -> prefix:'a t -> equal:('a -> 'a -> bool) -> bool
is_prefix xs ~prefix
returnstrue
ifxs
starts withprefix
.
val find_consecutive_duplicate : 'a t -> equal:('a -> 'a -> bool) -> ('a * 'a) option
find_consecutive_duplicate t ~equal
returns the first pair of consecutive elements(a1, a2)
int
such thatequal a1 a2
. They are returned in the same order as they appear int
.equal
need not be an equivalence relation; it is simply used as a predicate on consecutive elements.
val remove_consecutive_duplicates : ?which_to_keep:[ `First | `Last ] -> 'a t -> equal:('a -> 'a -> bool) -> 'a t
Returns the given list with consecutive duplicates removed. The relative order of the other elements is unaffected. The element kept from a run of duplicates is determined by
which_to_keep
.
val dedup_and_sort : compare:('a -> 'a -> int) -> 'a t -> 'a t
Returns the given list with duplicates removed and in sorted order.
val find_a_dup : compare:('a -> 'a -> int) -> 'a t -> 'a option
find_a_dup
returns a duplicate from the list (with no guarantees about which duplicate you get), orNone
if there are no dups.
val contains_dup : compare:('a -> 'a -> int) -> 'a t -> bool
Returns true if there are any two elements in the list which are the same. O(n log n) time complexity.
val find_all_dups : compare:('a -> 'a -> int) -> 'a t -> 'a list
find_all_dups
returns a list of all elements that occur more than once, with no guarantees about order. O(n log n) time complexity.
val count : 'a t -> f:('a -> bool) -> int
count l ~f
is the number of elements inl
that satisfy the predicatef
.
val counti : 'a t -> f:(int -> 'a -> bool) -> int
val range : ?stride:int -> ?start:[ `inclusive | `exclusive ] -> ?stop:[ `inclusive | `exclusive ] -> int -> int -> int t
range ?stride ?start ?stop start_i stop_i
is the list of integers fromstart_i
tostop_i
, stepping bystride
. Ifstride
< 0 then we needstart_i
>stop_i
for the result to be nonempty (orstart_i
=stop_i
in the case where both bounds are inclusive).
val range' : compare:('a -> 'a -> int) -> stride:('a -> 'a) -> ?start:[ `inclusive | `exclusive ] -> ?stop:[ `inclusive | `exclusive ] -> 'a -> 'a -> 'a t
range'
is analogous torange
for general start/stop/stride types.range'
raises ifstride x
returnsx
or if the direction thatstride x
movesx
changes from one call to the next.
val init : int -> f:(int -> 'a) -> 'a t
init n ~f
is[(f 0); (f 1); ...; (f (n-1))]
. It is an error ifn < 0
.init
appliesf
to values in decreasing order; starting withn - 1
, and ending with0
. This is the opposite order toArray.init
.
val rev_filter_map : 'a t -> f:('a -> 'b option) -> 'b t
rev_filter_map l ~f
is the reversed sublist ofl
containing only elements for whichf
returnsSome e
.
val rev_filter_mapi : 'a t -> f:(int -> 'a -> 'b option) -> 'b t
rev_filter_mapi is just like
rev_filter_map
, but it also passes in the index of each element as the first argument to the mapped function. Tail-recursive.
val filter_map : 'a t -> f:('a -> 'b option) -> 'b t
filter_map l ~f
is the sublist ofl
containing only elements for whichf
returnsSome e
.
val filter_mapi : 'a t -> f:(int -> 'a -> 'b option) -> 'b t
filter_mapi is just like
filter_map
, but it also passes in the index of each element as the first argument to the mapped function. Tail-recursive.
val filter_opt : 'a option t -> 'a t
filter_opt l
is the sublist ofl
containing only elements which areSome e
. In other words,filter_opt l
=filter_map ~f:ident l
.
module Assoc : sig ... end
Interpret a list of (key, value) pairs as a map in which only the first occurrence of a key affects the semantics, i.e.:
val sub : 'a t -> pos:int -> len:int -> 'a t
sub pos len l
is thelen
-element sublist ofl
, starting atpos
.
val take : 'a t -> int -> 'a t
take l n
returns the firstn
elements ofl
, or all ofl
ifn > length l
.take l n = fst (split_n l n)
.
val drop : 'a t -> int -> 'a t
drop l n
returnsl
without the firstn
elements, or the empty list ifn > length l
.drop l n
is equivalent tosnd (split_n l n)
.
val take_while : 'a t -> f:('a -> bool) -> 'a t
take_while l ~f
returns the longest prefix ofl
for whichf
istrue
.
val drop_while : 'a t -> f:('a -> bool) -> 'a t
drop_while l ~f
drops the longest prefix ofl
for whichf
istrue
.
val split_while : 'a t -> f:('a -> bool) -> 'a t * 'a t
split_while xs ~f = (take_while xs ~f, drop_while xs ~f)
.
val drop_last : 'a t -> 'a t option
drop_last l
drops the last element ofl
, returningNone
ifl
isempty
.
val drop_last_exn : 'a t -> 'a t
val concat : 'a t t -> 'a t
Concatenates a list of lists. The elements of the argument are all concatenated together (in the same order) to give the result. Tail recursive over outer and inner lists.
val concat_no_order : 'a t t -> 'a t
Like
concat
, but faster and without preserving any ordering (i.e., for lists that are essentially viewed as multi-sets).
val cons : 'a -> 'a t -> 'a t
val cartesian_product : 'a t -> 'b t -> ('a * 'b) t
Returns a list with all possible pairs -- if the input lists have length
len1
andlen2
, the resulting list will have lengthlen1 * len2
.
val permute : ?random_state:Base.Random.State.t -> 'a t -> 'a t
permute ?random_state t
returns a permutation oft
.permute
side-effectsrandom_state
by repeated calls toRandom.State.int
. Ifrandom_state
is not supplied,permute
usesRandom.State.default
.
val random_element : ?random_state:Base.Random.State.t -> 'a t -> 'a option
random_element ?random_state t
isNone
ift
is empty, else it isSome x
for somex
chosen uniformly at random fromt
.random_element
side-effectsrandom_state
by callingRandom.State.int
. Ifrandom_state
is not supplied,random_element
usesRandom.State.default
.
val random_element_exn : ?random_state:Base.Random.State.t -> 'a t -> 'a
val is_sorted : 'a t -> compare:('a -> 'a -> int) -> bool
is_sorted t ~compare
returnstrue
iff for all adjacenta1; a2
int
,compare a1 a2 <= 0
.is_sorted_strictly
is similar, except it uses<
instead of<=
.
val is_sorted_strictly : 'a t -> compare:('a -> 'a -> int) -> bool
val equal : ('a -> 'a -> bool) -> 'a t -> 'a t -> bool
module Infix : sig ... end
val transpose : 'a t t -> 'a t t option
transpose m
transposes the rows and columns of the matrixm
, considered as either a row of column lists or (dually) a column of row lists.Example:
transpose [[1;2;3];[4;5;6]] = [[1;4];[2;5];[3;6]]
On non-empty rectangular matrices,
transpose
is an involution (i.e.,transpose (transpose m) = m
). Transpose returnsNone
when called on lists of lists with non-uniform lengths.