Модуль ListLabels
module ListLabels: sig .. end
Операции со списками.
Некоторые функции помечены как не хвосторекурсивные. Хвосторекурсивная функция использует стек постоянного размера, тогда как не хвосторекурсивная функция использует стек, размер которого пропорционален длине списка-аргумента; это может стать проблемой при работе с очень длинными списками. Если функция принимает несколько аргументов-списков, в скобках приведена примерная формула использования стека (в некоторых неуказанных постоянных единицах).
Обычно приведённые выше соображения можно не учитывать, если длина ваших списков не превышает примерно 10000 элементов.
Версию этого модуля с метками можно использовать так, как описано в модуле StdLabels.
type 'a t = 'a list =
|
| []
|
|
| (::) of
|
Псевдоним типа списков.
val length : 'a list -> int
Возвращает длину (количество элементов) заданного списка.
val compare_lengths : 'a list -> 'b list -> int
Сравнивает длины двух списков. compare_lengths l1 l2 эквивалентно compare (length l1) (length l2), но вычисление прекращается при достижении конца более короткого списка.
- Начиная с версии 4.05
val compare_length_with : 'a list -> len:int -> int
Сравнивает длину списка с целым числом. compare_length_with l len эквивалентно compare (length l) len, но вычисление выполняет не более len итераций по списку.
- Начиная с версии 4.05
val is_empty : 'a list -> bool
is_empty l истинно тогда и только тогда, когда l не содержит элементов. Эквивалентно compare_length_with l 0 = 0.
- Начиная с версии 5.1
val cons : 'a -> 'a list -> 'a list
cons x xs — это x :: xs
- Начиная с версии 4.05
val singleton : 'a -> 'a list
singleton x возвращает список из одного элемента [x].
- Начиная с версии 5.4
val hd : 'a list -> 'a
Возвращает первый элемент заданного списка.
-
Вызывает исключение
Failure, если список пуст.
val tl : 'a list -> 'a list
Возвращает заданный список без первого элемента.
-
Вызывает исключение
Failure, если список пуст.
val nth : 'a list -> int -> 'a
Возвращает n-й элемент заданного списка. Первый элемент (голова списка) находится на позиции 0.
-
Вызывает исключение
-
Failure, если список слишком короткий. -
Invalid_argument, еслиnотрицательно.
-
val nth_opt : 'a list -> int -> 'a option
Возвращает n-й элемент заданного списка. Первый элемент (голова списка) находится на позиции 0. Возвращает None, если список слишком короткий.
- Начиная с версии 4.05
-
Вызывает исключение
Invalid_argument, еслиnотрицательно.
val rev : 'a list -> 'a list
Обращение списка.
val init : len:int -> f:(int -> 'a) -> 'a list
init ~len ~f — это [f 0; f 1; ...; f (len-1)], вычисляемое слева направо.
- Начиная с версии 4.06
-
Вызывает исключение
Invalid_argument, еслиlen < 0.
val append : 'a list -> 'a list -> 'a list
append l0 l1 добавляет l1 в конец l0. Та же функция, что и инфиксный оператор @.
- Начиная с версии 5.1 эта функция хвосторекурсивна.
val rev_append : 'a list -> 'a list -> 'a list
rev_append l1 l2 обращает l1 и объединяет его с l2. Эквивалентно (ListLabels.rev l1) @ l2.
val concat : 'a list list -> 'a list
Объединяет список списков. Все элементы аргумента объединяются вместе (в том же порядке), образуя результат. Не хвосторекурсивна (длина аргумента + длина самого длинного вложенного списка).
val flatten : 'a list list -> 'a list
То же, что ListLabels.concat. Не хвосторекурсивна (длина аргумента + длина самого длинного вложенного списка).
Сравнение
val equal : eq:('a -> 'a -> bool) -> 'a list -> 'a list -> bool
equal eq [a1; ...; an] [b1; ..; bm] выполняется, если входные списки имеют одинаковую длину и для каждой пары элементов ai, bi, находящихся на одной позиции, выполняется eq ai bi.
Примечание: функция eq может вызываться, даже если длины списков различаются. Если функция сравнения равенства затратна, сначала можно проверить ListLabels.compare_lengths.
- Начиная с версии 4.12
val compare : cmp:('a -> 'a -> int) -> 'a list -> 'a list -> int
compare cmp [a1; ...; an] [b1; ...; bm] выполняет лексикографическое сравнение двух входных списков, используя тот же интерфейс 'a -> 'a -> int, что и compare:
-
a1 :: l1меньшеa2 :: l2(результат отрицательный), еслиa1меньшеa2или если они равны (результат равен 0), аl1меньшеl2 - пустой список
[]строго меньше непустых списков
Примечание: функция cmp будет вызвана, даже если длины списков различаются.
- Начиная с версии 4.12
Итераторы
val iter : f:('a -> unit) -> 'a list -> unit
iter ~f [a1; ...; an] последовательно применяет функцию f к [a1; ...; an]. Эквивалентно f a1; f a2; ...; f an.
val iteri : f:(int -> 'a -> unit) -> 'a list -> unit
То же, что ListLabels.iter, но функция получает первым аргументом индекс элемента (начиная с 0), а вторым — сам элемент.
- Начиная с версии 4.00
val map : f:('a -> 'b) -> 'a list -> 'b list
map ~f [a1; ...; an] применяет функцию f к a1, ..., an и строит список [f a1; ...; f an] из результатов, возвращённых f.
val mapi : f:(int -> 'a -> 'b) -> 'a list -> 'b list
То же, что ListLabels.map, но функция получает первым аргументом индекс элемента (начиная с 0), а вторым — сам элемент.
- Начиная с версии 4.00
val rev_map : f:('a -> 'b) -> 'a list -> 'b list
rev_map ~f l даёт тот же результат, что ListLabels.rev (ListLabels.map f l), но работает эффективнее.
val filter_map : f:('a -> 'b option) -> 'a list -> 'b list
filter_map ~f l применяет f к каждому элементу l, отбрасывает элементы None и возвращает список аргументов элементов Some.
- Начиная с версии 4.08
val filter_mapi : f:(int -> 'a -> 'b option) -> 'a list -> 'b list
То же, что ListLabels.filter_map, но функция получает первым аргументом индекс элемента (начиная с 0), а вторым — сам элемент.
- Начиная с версии 5.5
val concat_map : f:('a -> 'b list) -> 'a list -> 'b list
concat_map ~f l даёт тот же результат, что ListLabels.concat (ListLabels.map f l). Хвосторекурсивна.
- Начиная с версии 4.10
val fold_left_map : f:('acc -> 'a -> 'acc * 'b) -> init:'acc -> 'a list -> 'acc * 'b list
fold_left_map сочетает в себе fold_left и map, передавая аккумулятор при вызовах f.
- Начиная с версии 4.11
val fold_left : f:('acc -> 'a -> 'acc) -> init:'acc -> 'a list -> 'acc
fold_left ~f ~init [b1; ...; bn] — это f (... (f (f init b1) b2) ...) bn.
val fold_right : f:('a -> 'acc -> 'acc) -> 'a list -> init:'acc -> 'acc
fold_right ~f [a1; ...; an] ~init — это f a1 (f a2 (... (f an init) ...)). Не хвосторекурсивна.
Итераторы для двух списков
val iter2 : f:('a -> 'b -> unit) -> 'a list -> 'b list -> unit
iter2 ~f [a1; ...; an] [b1; ...; bn] последовательно вызывает f a1 b1; ...; f an bn.
-
Вызывает исключение
Invalid_argument, если установлено, что длины двух списков различаются.
val map2 : f:('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list
map2 ~f [a1; ...; an] [b1; ...; bn] — это [f a1 b1; ...; f an bn].
-
Вызывает исключение
Invalid_argument, если установлено, что длины двух списков различаются.
val rev_map2 : f:('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list
rev_map2 ~f l1 l2 даёт тот же результат, что ListLabels.rev (ListLabels.map2 f l1 l2), но работает эффективнее.
val fold_left2 : f:('acc -> 'a -> 'b -> 'acc) -> init:'acc -> 'a list -> 'b list -> 'acc
fold_left2 ~f ~init [a1; ...; an] [b1; ...; bn] — это f (... (f (f init a1 b1) a2 b2) ...) an bn.
-
Вызывает исключение
Invalid_argument, если установлено, что длины двух списков различаются.
val fold_right2 : f:('a -> 'b -> 'acc -> 'acc) -> 'a list -> 'b list -> init:'acc -> 'acc
fold_right2 ~f [a1; ...; an] [b1; ...; bn] ~init — это f a1 b1 (f a2 b2 (... (f an bn init) ...)).
-
Вызывает исключение
Invalid_argument, если установлено, что длины двух списков различаются. Не хвосторекурсивна.
Проверка списков
val for_all : f:('a -> bool) -> 'a list -> bool
for_all ~f [a1; ...; an] проверяет, удовлетворяют ли все элементы списка предикату f. То есть для непустого списка возвращает (f a1) && (f a2) && ... && (f an), а для пустого — true.
val exists : f:('a -> bool) -> 'a list -> bool
exists ~f [a1; ...; an] проверяет, удовлетворяет ли хотя бы один элемент списка предикату f. То есть для непустого списка возвращает (f a1) || (f a2) || ... || (f an), а для пустого — false.
val for_all2 : f:('a -> 'b -> bool) -> 'a list -> 'b list -> bool
То же, что ListLabels.for_all, но для предиката с двумя аргументами.
-
Вызывает исключение
Invalid_argument, если установлено, что длины двух списков различаются.
val exists2 : f:('a -> 'b -> bool) -> 'a list -> 'b list -> bool
То же, что ListLabels.exists, но для предиката с двумя аргументами.
-
Вызывает исключение
Invalid_argument, если установлено, что длины двух списков различаются.
val mem : 'a -> set:'a list -> bool
mem a ~set истинно тогда и только тогда, когда a равен одному из элементов set.
val memq : 'a -> set:'a list -> bool
То же, что ListLabels.mem, но для сравнения элементов списка используется физическое равенство вместо структурного.
Поиск в списке
val find : f:('a -> bool) -> 'a list -> 'a
find ~f l возвращает первый элемент списка l, удовлетворяющий предикату f.
-
Вызывает исключение
Not_found, если в спискеlнет значения, удовлетворяющегоf.
val find_opt : f:('a -> bool) -> 'a list -> 'a option
find ~f l возвращает первый элемент списка l, удовлетворяющий предикату f. Возвращает None, если в списке l нет значения, удовлетворяющего f.
- Начиная с версии 4.05
val find_index : f:('a -> bool) -> 'a list -> int option
find_index ~f xs возвращает Some i, где i — индекс первого элемента списка xs, удовлетворяющего f x, если такой элемент есть.
Если такого элемента нет, возвращает None.
- Начиная с версии 5.1
val find_map : f:('a -> 'b option) -> 'a list -> 'b option
find_map ~f l применяет f к элементам l по порядку и возвращает первый результат вида Some v либо None, если таких результатов нет.
- Начиная с версии 4.10
val find_mapi : f:(int -> 'a -> 'b option) -> 'a list -> 'b option
То же, что find_map, но предикат получает первым аргументом индекс элемента (начиная с 0), а вторым — сам элемент.
- Начиная с версии 5.1
val filter : f:('a -> bool) -> 'a list -> 'a list
filter ~f l возвращает все элементы списка l, удовлетворяющие предикату f. Порядок элементов во входном списке сохраняется.
val find_all : f:('a -> bool) -> 'a list -> 'a list
find_all — другое название для ListLabels.filter.
val filteri : f:(int -> 'a -> bool) -> 'a list -> 'a list
То же, что ListLabels.filter, но предикат получает первым аргументом индекс элемента (начиная с 0), а вторым — сам элемент.
- Начиная с версии 4.11
Обработка списков
val take : int -> 'a list -> 'a list
take n l возвращает префикс l длины n или копию l, если n > length l. Если n отрицательно, возвращается пустой список.
Предупреждение. Только в версии 5.3 эта функция вызывает Invalid_argument при отрицательных значениях n.
- Начиная с версии 5.3
val drop : int -> 'a list -> 'a list
drop n l возвращает суффикс l после n элементов или [], если n > length l. Если n отрицательно, результатом будет l.
Предупреждение. Только в версии 5.3 эта функция вызывает Invalid_argument при отрицательных значениях n.
- Начиная с версии 5.3
val take_while : f:('a -> bool) -> 'a list -> 'a list
take_while p l — самый длинный (возможно, пустой) префикс l, содержащий только элементы, удовлетворяющие p.
- Начиная с версии 5.3
val drop_while : f:('a -> bool) -> 'a list -> 'a list
drop_while p l — самый длинный (возможно, пустой) суффикс l, начинающийся с первого элемента, который не удовлетворяет p.
- Начиная с версии 5.3
val partition : f:('a -> bool) -> 'a list -> 'a list * 'a list
partition ~f l возвращает пару списков (l1, l2), где l1 — список всех элементов l, удовлетворяющих предикату f, а l2 — список всех элементов l, не удовлетворяющих f. Порядок элементов во входном списке сохраняется.
val partition_map : f:('a -> ('b, 'c) Either.t) -> 'a list -> 'b list * 'c list
partition_map f l возвращает пару списков (l1, l2) таких, что для каждого элемента x входного списка l:
- если
f xравноLeft y1, тоy1входит вl1, и - если
f xравноRight y2, тоy2входит вl2.
Выходные элементы включаются в l1 и l2 в том же относительном порядке, что и соответствующие входные элементы в l.
В частности, partition_map (fun x -> if f x then Left x else Right x) l эквивалентно partition f l.
- Начиная с версии 4.12
Ассоциативные списки
val assoc : 'a -> ('a * 'b) list -> 'b
assoc a l возвращает значение, связанное с ключом a в списке пар l. То есть assoc a [ ...; (a,b); ...] = b, если (a,b) является самой левой привязкой a в списке l.
-
Вызывает исключение
Not_found, если в спискеlнет значения, связанного сa.
val assoc_opt : 'a -> ('a * 'b) list -> 'b option
assoc_opt a l возвращает значение, связанное с ключом a в списке пар l. То есть assoc_opt a [ ...; (a,b); ...] = Some b, если (a,b) является самой левой привязкой a в списке l. Возвращает None, если в списке l нет значения, связанного с a.
- Начиная с версии 4.05
val assq : 'a -> ('a * 'b) list -> 'b
То же, что ListLabels.assoc, но для сравнения ключей используется физическое равенство вместо структурного.
val assq_opt : 'a -> ('a * 'b) list -> 'b option
То же, что ListLabels.assoc_opt, но для сравнения ключей используется физическое равенство вместо структурного.
- Начиная с версии 4.05
val mem_assoc : 'a -> map:('a * 'b) list -> bool
То же, что ListLabels.assoc, но просто возвращает true, если привязка существует, и false, если для заданного ключа привязок нет.
val mem_assq : 'a -> map:('a * 'b) list -> bool
То же, что ListLabels.mem_assoc, но для сравнения ключей используется физическое равенство вместо структурного.
val remove_assoc : 'a -> ('a * 'b) list -> ('a * 'b) list
remove_assoc a l возвращает список пар l без первой пары с ключом a, если такая пара есть. Не хвосторекурсивна.
val remove_assq : 'a -> ('a * 'b) list -> ('a * 'b) list
То же, что ListLabels.remove_assoc, но для сравнения ключей используется физическое равенство вместо структурного. Не хвосторекурсивна.
Списки пар
val split : ('a * 'b) list -> 'a list * 'b list
Преобразует список пар в пару списков: split [(a1,b1); ...; (an,bn)] — это ([a1; ...; an], [b1; ...; bn]). Не хвосторекурсивна.
val split_map : f:('c -> 'a * 'b) -> 'c list -> 'a list * 'b list
split_map ~f l эквивалентно split (map ~f l), но позволяет избежать выделения промежуточных списков.
- Начиная с версии 5.5. Не хвосторекурсивна.
val combine : 'a list -> 'b list -> ('a * 'b) list
Преобразует пару списков в список пар: combine [a1; ...; an] [b1; ...; bn] — это [(a1,b1); ...; (an,bn)].
-
Вызывает исключение
Invalid_argument, если длины двух списков различаются. Не хвосторекурсивна.
Сортировка
val sort : cmp:('a -> 'a -> int) -> 'a list -> 'a list
Сортирует список по возрастанию с помощью функции сравнения. Функция сравнения должна возвращать 0, если её аргументы равны; положительное целое число, если первый аргумент больше; и отрицательное целое число, если первый аргумент меньше (полное описание см. в Array.sort). Например, compare подходит в качестве функции сравнения. Результирующий список отсортирован по возрастанию. Гарантируется, что ListLabels.sort использует постоянный объём памяти в куче (помимо размера результирующего списка) и логарифмический объём памяти в стеке.
Текущая реализация использует сортировку слиянием. Она использует постоянный объём памяти в куче и логарифмический объём памяти в стеке.
val stable_sort : cmp:('a -> 'a -> int) -> 'a list -> 'a list
То же, что ListLabels.sort, но алгоритм сортировки гарантированно стабилен (то есть элементы, которые считаются равными, сохраняют исходный порядок).
Текущая реализация использует сортировку слиянием. Она использует постоянный объём памяти в куче и логарифмический объём памяти в стеке.
val fast_sort : cmp:('a -> 'a -> int) -> 'a list -> 'a list
То же, что ListLabels.sort или ListLabels.stable_sort, в зависимости от того, какой алгоритм быстрее на типичных входных данных.
val sort_uniq : cmp:('a -> 'a -> int) -> 'a list -> 'a list
То же, что ListLabels.sort, но также удаляет дубликаты: если несколько элементов считаются равными, сохраняется только первый.
- До версии 5.4 сохранялся не обязательно первый элемент.
- Начиная с версии 4.03
val merge : cmp:('a -> 'a -> int) -> 'a list -> 'a list -> 'a list
Объединяет два списка: если l1 и l2 отсортированы согласно функции сравнения cmp, то merge ~cmp l1 l2 вернёт отсортированный список, содержащий все элементы l1 и l2. Если несколько элементов считаются равными, элементы l1 будут расположены перед элементами l2. Не хвосторекурсивна (суммарная длина аргументов).
Списки и последовательности
val to_seq : 'a list -> 'a Seq.t
Выполняет итерацию по списку.
- Начиная с версии 4.07
val of_seq : 'a Seq.t -> 'a list
Создаёт список из последовательности.
- Начиная с версии 4.07
© 1995-2026 INRIA.
https://ocaml.org/manual/5.5/api/ListLabels.html