Spec-Zone.ru › OCaml

Список модуля

module List: sig .. end

Операции со списками.

Некоторые функции помечены как нерекурсивные по хвосту. Функция с хвостовой рекурсией использует постоянный объём стека, а функция без хвостовой рекурсии использует объём стека, пропорциональный длине списка-аргумента, что может стать проблемой при работе с очень длинными списками. Если у функции несколько списков-аргументов, в скобках указана приблизительная формула использования стека (в некоторых неопределённых постоянных единицах).

Обычно приведённые выше соображения можно не учитывать, если длина ваших списков не превышает примерно 10000 элементов.

Модуль с метками можно использовать, как описано в модуле StdLabels.

type 'a t = 'a list = 
| []
| (::) of 'a * 'a list

Псевдоним типа списков.

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 -> 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.03 (4.05 в ListLabels)
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 : int -> (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. Эквивалентно (List.rev l1) @ l2.

val concat : 'a list list -> 'a list

Объединяет список списков. Все элементы аргумента объединяются (в том же порядке), образуя результат. Без хвостовой рекурсии (длина аргумента + длина самого длинного вложенного списка).

val flatten : 'a list list -> 'a list

То же, что и List.concat. Без хвостовой рекурсии (длина аргумента + длина самого длинного вложенного списка).

Сравнение

val equal : ('a -> 'a -> bool) -> 'a list -> 'a list -> bool

equal eq [a1; ...; an] [b1; ..; bm] выполняется, если входные списки имеют одинаковую длину и для каждой пары элементов ai, bi, находящихся на одной позиции, выполняется eq ai bi.

Примечание: функция eq может быть вызвана, даже если списки имеют разную длину. Если функция сравнения на равенство затратна, сначала можно проверить List.compare_lengths.

  • Начиная с версии 4.12
val compare : ('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 : ('a -> unit) -> 'a list -> unit

iter f [a1; ...; an] последовательно применяет функцию f к [a1; ...; an]. Эквивалентно f a1; f a2; ...; f an.

val iteri : (int -> 'a -> unit) -> 'a list -> unit

То же, что и List.iter, но функция получает первым аргументом индекс элемента (отсчёт начинается с 0), а вторым — сам элемент.

  • Начиная с версии 4.00
val map : ('a -> 'b) -> 'a list -> 'b list

map f [a1; ...; an] применяет функцию f к a1, ..., an и строит список [f a1; ...; f an] из результатов, возвращённых f.

val mapi : (int -> 'a -> 'b) -> 'a list -> 'b list

То же, что и List.map, но функция получает первым аргументом индекс элемента (отсчёт начинается с 0), а вторым — сам элемент.

  • Начиная с версии 4.00
val rev_map : ('a -> 'b) -> 'a list -> 'b list

rev_map f l даёт тот же результат, что и List.rev (List.map f l), но работает эффективнее.

val filter_map : ('a -> 'b option) -> 'a list -> 'b list

filter_map f l применяет f к каждому элементу l, отфильтровывает элементы None и возвращает список аргументов для элементов Some.

  • Начиная с версии 4.08
val filter_mapi : (int -> 'a -> 'b option) -> 'a list -> 'b list

То же, что и List.filter_map, но функция получает первым аргументом индекс элемента (отсчёт начинается с 0), а вторым — сам элемент.

  • Начиная с версии 5.5
val concat_map : ('a -> 'b list) -> 'a list -> 'b list

concat_map f l даёт тот же результат, что и List.concat (List.map f l). Использует хвостовую рекурсию.

  • Начиная с версии 4.10
val fold_left_map : ('acc -> 'a -> 'acc * 'b) -> 'acc -> 'a list -> 'acc * 'b list

fold_left_map сочетает в себе fold_left и map, передавая аккумулятор между вызовами f.

  • Начиная с версии 4.11
val fold_left : ('acc -> 'a -> 'acc) -> 'acc -> 'a list -> 'acc

fold_left f init [b1; ...; bn] — это f (... (f (f init b1) b2) ...) bn.

val fold_right : ('a -> 'acc -> 'acc) -> 'a list -> 'acc -> 'acc

fold_right f [a1; ...; an] init — это f a1 (f a2 (... (f an init) ...)). Без хвостовой рекурсии.

Итераторы по двум спискам

val iter2 : ('a -> 'b -> unit) -> 'a list -> 'b list -> unit

iter2 f [a1; ...; an] [b1; ...; bn] последовательно вызывает f a1 b1; ...; f an bn.

  • Вызывает исключение Invalid_argument, если установлено, что длины двух списков различаются.
val map2 : ('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 : ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list

rev_map2 f l1 l2 даёт тот же результат, что и List.rev (List.map2 f l1 l2), но работает эффективнее.

val fold_left2 : ('acc -> 'a -> 'b -> 'acc) -> '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 : ('a -> 'b -> 'acc -> 'acc) -> 'a list -> 'b list -> '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 : ('a -> bool) -> 'a list -> bool

for_all f [a1; ...; an] проверяет, удовлетворяют ли все элементы списка предикату f. То есть для непустого списка функция возвращает (f a1) && (f a2) && ... && (f an), а для пустого — true.

val exists : ('a -> bool) -> 'a list -> bool

exists f [a1; ...; an] проверяет, удовлетворяет ли хотя бы один элемент списка предикату f. То есть для непустого списка функция возвращает (f a1) || (f a2) || ... || (f an), а для пустого — false.

val for_all2 : ('a -> 'b -> bool) -> 'a list -> 'b list -> bool

То же, что и List.for_all, но для двухаргументного предиката.

  • Вызывает исключение Invalid_argument, если установлено, что длины двух списков различаются.
val exists2 : ('a -> 'b -> bool) -> 'a list -> 'b list -> bool

То же, что и List.exists, но для двухаргументного предиката.

  • Вызывает исключение Invalid_argument, если установлено, что длины двух списков различаются.
val mem : 'a -> 'a list -> bool

mem a set истинно тогда и только тогда, когда a равен одному из элементов set.

val memq : 'a -> 'a list -> bool

То же, что и List.mem, но для сравнения элементов списка используется физическое равенство вместо структурного.

Поиск в списках

val find : ('a -> bool) -> 'a list -> 'a

find f l возвращает первый элемент списка l, удовлетворяющий предикату f.

  • Вызывает исключение Not_found, если в списке l нет значения, удовлетворяющего f.
val find_opt : ('a -> bool) -> 'a list -> 'a option

find f l возвращает первый элемент списка l, удовлетворяющий предикату f. Возвращает None, если в списке l нет значения, удовлетворяющего f.

  • Начиная с версии 4.05
val find_index : ('a -> bool) -> 'a list -> int option

find_index f xs возвращает Some i, где i — индекс первого элемента списка xs, удовлетворяющего f x, если такой элемент существует.

Если такого элемента нет, функция возвращает None.

  • Начиная с версии 5.1
val find_map : ('a -> 'b option) -> 'a list -> 'b option

find_map f l по порядку применяет f к элементам l и возвращает первый результат вида Some v либо None, если таких результатов нет.

  • Начиная с версии 4.10
val find_mapi : (int -> 'a -> 'b option) -> 'a list -> 'b option

То же, что и find_map, но предикат получает первым аргументом индекс элемента (отсчёт начинается с 0), а вторым — сам элемент.

  • Начиная с версии 5.1
val filter : ('a -> bool) -> 'a list -> 'a list

filter f l возвращает все элементы списка l, удовлетворяющие предикату f. Порядок элементов исходного списка сохраняется.

val find_all : ('a -> bool) -> 'a list -> 'a list

find_all — другое название для List.filter.

val filteri : (int -> 'a -> bool) -> 'a list -> 'a list

То же, что и List.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 : ('a -> bool) -> 'a list -> 'a list

take_while p l — самый длинный (возможно, пустой) префикс l, содержащий только элементы, удовлетворяющие p.

  • Начиная с версии 5.3
val drop_while : ('a -> bool) -> 'a list -> 'a list

drop_while p l — самый длинный (возможно, пустой) суффикс l, начинающийся с первого элемента, который не удовлетворяет p.

  • Начиная с версии 5.3
val partition : ('a -> bool) -> 'a list -> 'a list * 'a list

partition f l возвращает пару списков (l1, l2), где l1 — список всех элементов l, удовлетворяющих предикату f, а l2 — список всех элементов l, не удовлетворяющих f. Порядок элементов исходного списка сохраняется.

val partition_map : ('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

То же, что и List.assoc, но для сравнения ключей используется физическое равенство вместо структурного.

val assq_opt : 'a -> ('a * 'b) list -> 'b option

То же, что и List.assoc_opt, но для сравнения ключей используется физическое равенство вместо структурного.

  • Начиная с версии 4.05
val mem_assoc : 'a -> ('a * 'b) list -> bool

То же, что и List.assoc, но просто возвращает true, если привязка существует, и false, если для заданного ключа привязок нет.

val mem_assq : 'a -> ('a * 'b) list -> bool

То же, что и List.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

То же, что и List.remove_assoc, но для сравнения ключей используется физическое равенство вместо структурного. Без хвостовой рекурсии.

Списки пар

val split : ('a * 'b) list -> 'a list * 'b list

Преобразует список пар в пару списков: split [(a1,b1); ...; (an,bn)] — это ([a1; ...; an], [b1; ...; bn]). Без хвостовой рекурсии.

val split_map : ('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 : ('a -> 'a -> int) -> 'a list -> 'a list

Сортирует список по возрастанию с помощью функции сравнения. Функция сравнения должна возвращать 0, если её аргументы равны; положительное целое число, если первый аргумент больше; и отрицательное целое число, если первый аргумент меньше (полное описание см. в Array.sort). Например, compare подходит в качестве функции сравнения. Полученный список отсортирован по возрастанию. Гарантируется, что List.sort использует постоянный объём памяти в куче (помимо размера результирующего списка) и логарифмический объём памяти в стеке.

В текущей реализации используется сортировка слиянием. Она использует постоянный объём памяти в куче и логарифмический объём памяти в стеке.

val stable_sort : ('a -> 'a -> int) -> 'a list -> 'a list

То же, что и List.sort, но алгоритм сортировки гарантированно является стабильным (то есть элементы, равные при сравнении, сохраняют исходный порядок).

В текущей реализации используется сортировка слиянием. Она использует постоянный объём памяти в куче и логарифмический объём памяти в стеке.

val fast_sort : ('a -> 'a -> int) -> 'a list -> 'a list

То же, что и List.sort или List.stable_sort — в зависимости от того, какой вариант быстрее для типичных входных данных.

val sort_uniq : ('a -> 'a -> int) -> 'a list -> 'a list

То же, что и List.sort, но также удаляет дубликаты: если несколько элементов равны при сравнении, сохраняется только первый.

  • До версии 5.4 сохранявшийся элемент не обязательно был первым.
  • Начиная с версии 4.02 (4.03 в ListLabels)
val merge : ('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/List.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API