Список меток 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), за исключением того, что вычисление останавливается после достижения конца самого короткого списка.
- 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, но для предиката с двумя аргументами.
-
Возбуждает исключение
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.
- Since 4.05
val find_map : f:('a -> 'b option) -> 'a list -> 'b option
find_map ~f l применяет f к элементам l в порядке следования и возвращает первый результат вида Some v, или None если таковых нет.
- Since 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) как первому аргументу, а сам элемент — как второму.
- Since 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.
- 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если нет значения, связанного сaв спискеl.
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 если нет значения, связанного с a в списке l.
- Since 4.05
val assq : 'a -> ('a * 'b) list -> 'b
Аналогично ListLabels.assoc, но использует физическое равенство вместо структурного равенства для сравнения ключей.
val assq_opt : 'a -> ('a * 'b) list -> 'b option
Аналогично ListLabels.assoc_opt, но использует физическое равенство вместо структурного равенства для сравнения ключей.
- Since 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, но также удаляет дубликаты.
- Since 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
Итерация по списку.
- Since 4.07
val of_seq : 'a Seq.t -> 'a list
Создание списка из последовательности.
- Since 4.07
© 1995-2022 INRIA.
https://v2.ocaml.org/releases/4.14/htmlman/libref/ListLabels.html