Spec-Zone.ru › OCaml 5.0

Список модулей

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), за исключением того, что вычисление останавливается после достижения конца самого короткого списка.

  • Since 4.05.0
val compare_length_with : 'a list -> int -> int

Сравнивает длину списка с целым числом. compare_length_with l len эквивалентно compare (length l) len, за исключением того, что вычисление останавливается после не более чем len итераций по списку.

  • Since 4.05.0
val cons : 'a -> 'a list -> 'a list

cons x xs является x :: xs

  • Since 4.03.0 (4.05.0 в ListLabels)
val hd : 'a list -> 'a

Возвращает первый элемент заданного списка.

  • Raises Failure если список пустой.
val tl : 'a list -> 'a list

Возвращает заданный список без его первого элемента.

  • Raises Failure если список пустой.
val nth : 'a list -> int -> 'a

Возвращает n-й элемент заданного списка. Первый элемент (начало списка) находится на позиции 0.

  • Raises
    • Failure если список слишком короткий.
    • Invalid_argument если n отрицательное.
val nth_opt : 'a list -> int -> 'a option

Возвращает n-й элемент заданного списка. Первый элемент (начало списка) находится на позиции 0. Возвращает None если список слишком короткий.

  • Since 4.05
  • Raises 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)], вычисляемое слева направо.

  • Since 4.06.0
  • Raises Invalid_argument если len < 0.
val append : 'a list -> 'a list -> 'a list

Конкатенация двух списков. Та же функция, что и инфиксный оператор @. Не является хвостовой рекурсией (длина первого аргумента). Оператор @ также не является хвостовой рекурсией.

val rev_append : 'a list -> 'a list -> 'a list

rev_append l1 l2 инвертирует l1 и конкатенирует его с l2. Это эквивалентно (List.rev l1) @ l2, но rev_append является хвостовой рекурсией и более эффективной.

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.

  • Since 4.12.0
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 будет вызвана даже если списки имеют разную длину.

  • Since 4.12.0

Итераторы

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), а сам элемент - как второй аргумент.

  • Since 4.00.0
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), а сам элемент - как второй аргумент. Не является хвостовой рекурсией.

  • Since 4.00.0
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 элементов.

  • Since 4.08.0
val concat_map : ('a -> 'b list) -> 'a list -> 'b list

concat_map f l дает тот же результат, что и List.concat (List.map f l). Хвостовая рекурсия.

  • Since 4.10.0
val fold_left_map : ('a -> 'b -> 'a * 'c) -> 'a -> 'b list -> 'a * 'c list

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

  • Since 4.11.0
val fold_left : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a

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

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

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.

  • Raises 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].

  • Raises 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 : ('a -> 'b -> 'c -> 'a) -> 'a -> 'b list -> 'c list -> 'a

fold_left2 f init [a1; ...; an] [b1; ...; bn] это f (... (f (f init a1 b1) a2 b2) ...) an bn.

  • Raises Invalid_argument если два списка определены как имеющие разную длину.
val fold_right2 : ('a -> 'b -> 'c -> 'c) -> 'a list -> 'b list -> 'c -> 'c

fold_right2 f [a1; ...; an] [b1; ...; bn] init это f a1 b1 (f a2 b2 (... (f an bn init) ...)).

  • Raises 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.

  • Since 4.05
val find_map : ('a -> 'b option) -> 'a list -> 'b option

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

  • Since 4.10.0
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) и к самому элементу в качестве второго аргумента.

  • Since 4.11.0
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.

  • Since 4.12.0

Списки ассоциаций

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.

  • Since 4.05
val assq : 'a -> ('a * 'b) list -> 'b

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

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

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

  • Since 4.05.0
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 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, но также удаляет дубликаты.

  • Since 4.02.0 (4.03.0 в 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

Итерация по списку.

  • Since 4.07
val of_seq : 'a Seq.t -> 'a list

Создание списка из последовательности.

  • Since 4.07

© 1995-2022 INRIA.
https://v2.ocaml.org/releases/5.0/htmlman/libref/List.html

Spec-Zone.ru

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