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

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

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

  • Since 4.05
val is_empty : 'a list -> bool

is_empty l истинно тогда и только тогда, когда l не содержит элементов. Эквивалентно compare_length_with l 0 = 0.

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

cons x xs равно x :: xs

  • Since 4.03 (4.05 в 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
  • Raises Invalid_argument если len < 0.
val append : 'a list -> 'a list -> 'a list

append l0 l1 добавляет l1 к l0. Та же функция, что и инфиксный оператор @.

  • Since 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 в первую очередь.

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

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

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

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

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

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

  • Since 4.10
val fold_left_map : ('acc -> 'a -> 'acc * 'b) -> 'acc -> 'a list -> 'acc * 'b list

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

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

  • 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 : ('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.

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

  • 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_index : ('a -> bool) -> 'a list -> int option

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

Возвращает None , если такого элемента нет.

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

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

  • Since 4.10
val find_mapi : (int -> 'a -> 'b option) -> 'a list -> 'b option

Аналогично find_map, но предикат применяется к индексу элемента (считая с 0) в качестве первого аргумента, а сам элемент - в качестве второго.

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

  • Since 4.11
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

Ассоциативные списки

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
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 (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

Пройтись по списку.

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

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

  • Since 4.07

© 1995-2024 INRIA.
https://ocaml.org/manual/5.2/api/List.html

Spec-Zone.ru

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