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 : (Hash.state -> 'a -> Hash.state) -> Hash.state -> 'a t -> Hash.state
include 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 ~freturns- f (... f (f (f init e1) e2) e3 ...) en, where- e1..enare the elements of- t
- val fold_result : 'a t -> init:'accum -> f:('accum -> 'a -> ('accum, 'e) Result.t) -> ('accum, 'e) Result.t
- fold_result t ~init ~fis a short-circuiting version of- foldthat runs in the- Resultmonad. If- freturns an- Error _, that value is returned without any additional invocations of- f.
- 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 ~finishis a short-circuiting version of- fold. If- freturns- Stop _the computation ceases and results in that value. If- freturns- Continue _, the fold will proceed. If- fnever returns- Stop _, the final result is computed by- finish.- 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 - trueif and only if there exists an element for which the provided function evaluates to- true. This is a short-circuiting operation.
- val for_all : 'a t -> f:('a -> bool) -> bool
- Returns - trueif and only if the provided function evaluates to- truefor 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 ifor all- iin the container.
- val find : 'a t -> f:('a -> bool) -> 'a option
- Returns as an - optionthe first element for which- fevaluates to true.
- val find_map : 'a t -> f:('a -> 'b option) -> 'b option
- Returns the first evaluation of - fthat returns- Some, and returns- Noneif 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 - comparefunction, or- Noneif the collection is empty. In case of a tie, the first element encountered while traversing the collection is returned. The implementation uses- foldso it has the same complexity as- fold.
- val max_elt : 'a t -> compare:('a -> 'a -> int) -> 'a option
include 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 vreturns the (trivial) computation that returns v.
- val ignore_m : 'a t -> unit t
- ignore_m tis- map t ~f:(fun _ -> ()).- ignore_mused to be called- ignore, but we decided that was a bad name, because it shadowed the widely used- Caml.ignore. Some monads still do- let ignore = ignore_mfor historical reasons.
- module Or_unequal_lengths : sig ... end
- Or_unequal_lengthsis 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 return- Unequal_lengthsif not all the lists have the same length.
- val of_list : 'a t -> 'a t
- of_listis the identity function. It is useful so that the- Listmodule 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 or- nis negative.
- val rev_append : 'a t -> 'a t -> 'a t
- rev_append l1 l2reverses- l1and concatenates it to- l2. This is equivalent to- (- List.rev- l1) @ l2, but- rev_appendis more efficient.
- val unordered_append : 'a t -> 'a t -> 'a t
- unordered_append l1 l2has the same elements as- l1 @ 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 ~fgives the same result as- List.rev- (- ListLabels.map- f l), but is more efficient.
- val iter2_exn : 'a t -> 'b t -> f:('a -> 'b -> unit) -> unit
- iter2 [a1; ...; an] [b1; ...; bn] ~fcalls in turn- f 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 ~fgives the same result as- List.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]is- f (... (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 ~freturns all the elements of the list- lthat satisfy the predicate- p. 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 ~fpartitions- taccording to- f.
- 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 ~freturns a pair of lists- (l1, l2), where- l1is the list of all the elements of- lthat satisfy the predicate- p, and- l2is the list of all the elements of- lthat do not satisfy- p. 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) Result.t t -> 'ok t * 'error t
- partition_result lreturns a pair of lists- (l1, l2), where- l1is the list of all- Okelements in- land- l2is the list of all- Errorelements. The order of elements in the input list is preserved.
- val split_n : 'a t -> int -> 'a t * 'a t
- split_n [e1; ...; em] nis- ([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.sortfor a complete specification). For example,- Poly.compareis 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 - l1and- l2are sorted according to the comparison function- compare,- merge compare l1 l2will return a sorted list containing all the elements of- l1and- l2. If several elements compare equal, the elements of- l1will be before the elements of- l2.
- 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 ~freturns the first element of- tthat satisfies- f. It raises- Caml.Not_foundor- Not_found_sif there is no such element.
- val find_map_exn : 'a t -> f:('a -> 'b option) -> 'b
- Returns the first evaluation of - fthat returns- Some. Raises- Caml.Not_foundor- Not_found_sif- falways returns- None.
- 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 function- fto- a1,- a2, ...,- an, in order, and builds the list- [f a1; ...; f an]with the results returned by- f.
- 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 ~fis- concat (map t ~f), except that there is no guarantee about the order in which- fis applied to the elements of- t.
- val concat_mapi : 'a t -> f:(int -> 'a -> 'b t) -> 'b t
- concat_mapi t ~fis 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] ~fis- [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 ~freverses- l1mapping- fover each element, and appends the result to the front of- l2.
- val fold_right : 'a t -> f:('a -> 'b -> 'b) -> init:'b -> 'b
- fold_right [a1; ...; an] ~f ~init:bis- f a1 (f a2 (... (f an b) ...)).
- val fold_left : 'a t -> init:'b -> f:('b -> 'a -> 'b) -> 'b
- fold_leftis the same as- Container.S1.fold, and one should always use- foldrather than- fold_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
- mapiis 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
- iteriis just like- iter, 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
- foldiis just like- fold, 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] ~fis- f (... (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_balancedreturns the same value as- reducewhen- fis associative, but differs in that the tree of nested applications of- fhas logarithmic depth.- This is useful when your - 'agrows in size as you reduce it and- fbecomes more expensive with bigger inputs. For example,- reduce_balanced ~f:(^)takes- n*log(n)time, while- reduce ~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 ~breakreturns a list of lists (i.e., groups) whose concatenation is equal to the original list. Each group is broken where- breakreturns 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 ~lengthreturns a list of lists whose concatenation is equal to the original list. Every list has- lengthelements, except for possibly the last list, which may have fewer.- chunks_ofraises if- length <= 0.
- val last : 'a t -> 'a option
- The final element of a list. The - _exnversion 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 ~prefixreturns- trueif- xsstarts with- prefix.
- val find_consecutive_duplicate : 'a t -> equal:('a -> 'a -> bool) -> ('a * 'a) option
- find_consecutive_duplicate t ~equalreturns the first pair of consecutive elements- (a1, a2)in- tsuch that- equal a1 a2. They are returned in the same order as they appear in- t.- equalneed 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 dedup : compare:('a -> 'a -> int) -> 'a t -> 'a t
- val find_a_dup : compare:('a -> 'a -> int) -> 'a t -> 'a option
- find_a_dupreturns a duplicate from the list (with no guarantees about which duplicate you get), or- Noneif 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_dupsreturns 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 ~fis the number of elements in- lthat satisfy the predicate- f.
- 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_iis the list of integers from- start_ito- stop_i, stepping by- stride. If- stride< 0 then we need- start_i>- stop_ifor the result to be nonempty (or- start_i=- stop_iin 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 to- rangefor general start/stop/stride types.- range'raises if- stride xreturns- xor if the direction that- stride xmoves- xchanges from one call to the next.
- val init : int -> f:(int -> 'a) -> 'a t
- init n ~fis- [(f 0); (f 1); ...; (f (n-1))]. It is an error if- n < 0.- initapplies- fto values in decreasing order; starting with- n - 1, and ending with- 0. This is the opposite order to- Array.init.
- val rev_filter_map : 'a t -> f:('a -> 'b option) -> 'b t
- rev_filter_map l ~fis the reversed sublist of- lcontaining only elements for which- freturns- Some 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 ~fis the sublist of- lcontaining only elements for which- freturns- Some 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 lis the sublist of- lcontaining only elements which are- Some 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 lis the- len-element sublist of- l, starting at- pos.
- val take : 'a t -> int -> 'a t
- take l nreturns the first- nelements of- l, or all of- lif- n > length l.- take l n = fst (split_n l n).
- val drop : 'a t -> int -> 'a t
- drop l nreturns- lwithout the first- nelements, or the empty list if- n > length l.- drop l nis equivalent to- snd (split_n l n).
- val take_while : 'a t -> f:('a -> bool) -> 'a t
- take_while l ~freturns the longest prefix of- lfor which- fis- true.
- val drop_while : 'a t -> f:('a -> bool) -> 'a t
- drop_while l ~fdrops the longest prefix of- lfor which- fis- true.
- 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 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 - len1and- len2, the resulting list will have length- len1 * len2.
- val permute : ?random_state:Random.State.t -> 'a t -> 'a t
- permute ?random_state treturns a permutation of- t.- permuteside-effects- random_stateby repeated calls to- Random.State.int. If- random_stateis not supplied,- permuteuses- Random.State.default.
- val random_element : ?random_state:Random.State.t -> 'a t -> 'a option
- random_element ?random_state tis- Noneif- tis empty, else it is- Some xfor some- xchosen uniformly at random from- t.- random_elementside-effects- random_stateby calling- Random.State.int. If- random_stateis not supplied,- random_elementuses- Random.State.default.
- val random_element_exn : ?random_state:Random.State.t -> 'a t -> 'a
- val is_sorted : 'a t -> compare:('a -> 'a -> int) -> bool
- is_sorted t ~comparereturns- trueiff for all adjacent- a1; a2in- t,- compare a1 a2 <= 0.- is_sorted_strictlyis 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 mtransposes the rows and columns of the matrix- m, 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, - transposeis an involution (i.e.,- transpose (transpose m) = m). Transpose returns- Nonewhen called on lists of lists with non-uniform lengths.