Spec-Zone.ru › OCaml 4.14

Модуль StdLabels.List

module List: ListLabels
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 -> len: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.05.0
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 : len:int -> f:(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. Это эквивалентно (ListLabels.rev l1) @ l2, но rev_append является хвостовой рекурсией и более эффективной.

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.

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

  • Since 4.12.0

Итераторы

val iter : f:('a -> unit) -> 'a list -> unit

iter ~f [a1; ...; an] применяет функцию f по очереди к a1; ...; an. Это эквивалентно begin f a1; f a2; ...; f an; () end.

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

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

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

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

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

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

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

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

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

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

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

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.

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

  • Raises 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:('a -> 'b -> 'c -> 'a) -> init:'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 : f:('a -> 'b -> 'c -> 'c) -> 'a list -> 'b list -> init:'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 : 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, но для предиката с двумя аргументами.

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

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

  • С момента 4.10.0
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.0
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.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.

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

  • С момента 4.03.0
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-2022 INRIA.
https://v2.ocaml.org/releases/4.14/htmlman/libref/StdLabels.List.html

Spec-Zone.ru

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