Модуль Seq
module Seq: sig .. end
Последовательности.
Последовательность типа 'a Seq.t можно рассматривать как отложенный список, то есть список, элементы которого вычисляются только тогда, когда они затребованы потребителем. Это позволяет производить и преобразовывать последовательности лениво (по одному элементу за раз), а не жадно (все элементы сразу). Это также позволяет строить концептуально бесконечные последовательности.
Тип 'a Seq.t определен как синоним для unit -> 'a Seq.node. Это тип функции: поэтому он непрозрачен. Потребитель может запросить элемент последовательности, чтобы получить следующий элемент (если он есть), но иначе никак не может проверить последовательность.
Поскольку он непрозрачен, тип 'a Seq.t не раскрывает, является ли последовательность:
- постоянной, что означает, что последовательность может быть использована столько раз, сколько требуется, производя одни и те же элементы каждый раз, как неизменяемый список; или
- временной, что означает, что последовательность не постоянна. Запрос временной последовательности может иметь наблюдаемое побочное действие, такое как инкрементирование изменяемого счетчика. В качестве общего частного случая, временная последовательность может быть аффинной, что означает, что она должна быть запрошена не более одного раза.
Он также не раскрывает, являются ли элементы последовательности:
- предвычисленные и сохранённые в памяти, что означает, что запросить последовательность дешево;
- вычислены при первом запросе и затем сохранены в памяти, что означает, что запросить последовательность один раз может быть дорого, но запросить ту же последовательность снова — дешево; или
- перевычисляются каждый раз, когда они запрашиваются, что может быть или не быть дешево.
Программист должен помнить об этих различиях, чтобы понять временные и пространственные требования последовательностей.
Для простоты большая часть последующей документации написана при неявном предположении, что последовательности постоянны. Мы обычно не указываем, когда или сколько раз вызывается каждая функция, потому что это было бы слишком громоздко. Например, в описании map, мы пишем: «если xs — это последовательность x0; x1; ..., то map f xs — это последовательность f x0; f x1; ...». Если бы мы хотели быть более ясными, мы могли бы указать, что преобразование происходит по требованию: то есть элементы map f xs вычисляются только тогда, когда они запрашиваются. Другими словами, определение let ys = map f xs завершается немедленно и не вызывает f. Вызов функции f x0 происходит только тогда, когда первый элемент ys запрашивается через вызов функции ys(). Кроме того, вызов ys() дважды заставляет f x0 вызываться дважды. Если требуется, чтобы f применялась не более одного раза к каждому элементу xs, даже в сценариях, где ys запрашивается более одного раза, то следует использовать let ys = memoize (map f xs).
Как общее правило, функции, которые строят последовательности, такие как map, filter, scan, take, и т.д., производят последовательности, элементы которых вычисляются только по требованию. Функции, которые жадно потребляют последовательности, такие как is_empty, find, length, iter, fold_left, и т.д., — это функции, которые заставляют вычисления происходить.
Если возможно, рекомендуется использовать последовательности вместо распределителей (функции типа unit -> 'a option , которые производят элементы по требованию). В то время как последовательности могут быть постоянными или временными, распределители всегда временные и, как правило, сложнее использовать, чем последовательности. Предоставляются две функции преобразования: Seq.to_dispenser и Seq.of_dispenser.
- С момента 4.07
type 'a t = unit -> 'a node
Последовательность xs типа 'a t — это отложенный список элементов типа 'a. Такая последовательность запрашивается путём выполнения функции xs(). Этот вызов функции возвращает узел, позволяя вызывающей стороне определить, пустая ли последовательность или нет, и в последнем случае получить ее голову и хвост.
type 'a node =
|
| Nil
|
|
| Cons of
|
Узел — это либо Nil, что означает, что последовательность пуста, либо Cons (x, xs), что означает, что x — первый элемент последовательности, а xs — остаток последовательности.
Потребление последовательностей
Функции в этом разделе потребляют свой аргумент — последовательность — частично или полностью:
-
is_emptyиunconsпотребляют последовательность до глубины 1. То есть, они запрашивают первый элемент последовательности, если он есть. -
iter,fold_left,length, и т.д., потребляют последовательность до конца. Они завершаются только если последовательность конечна. -
for_all,exists,find, и т.д. потребляют последовательность до определенной глубины, которая априори непредсказуема.
Аналогично, среди функций, потребляющих две последовательности, можно выделить две группы:
-
iter2иfold_left2потребляют обе последовательности до конца, при условии, что они имеют одинаковую длину. -
for_all2,exists2,equal,compareпотребляют последовательности до определённой глубины, которая априори непредсказуема.
Функции, потребляющие две последовательности, могут быть применены к последовательностям разной длины: в этом случае избыточные элементы в более длинной последовательности игнорируются. (Возможен случай, когда запрашивается один лишний элемент, хотя этот элемент не используется.)
Ни одна из функций в этом разделе не является ленивой. Эти функции являются потребителями: они заставляют выполняться вычисления.
val is_empty : 'a t -> bool
is_empty xs определяет, пуста ли последовательность xs.
Рекомендуется, чтобы последовательность xs была постоянной. Действительно, is_empty xs запрашивает голову последовательности xs, поэтому, если xs временная, может случиться, что xs больше нельзя использовать после этого вызова.
- С момента 4.14
val uncons : 'a t -> ('a * 'a t) option
Если xs пуста, то uncons xs равно None.
Если xs не пуста, то uncons xs равно Some (x, ys) , где x — голова последовательности, а ys — ее хвост.
- С момента 4.14
val length : 'a t -> int
length xs — это длина последовательности xs.
Последовательность xs должна быть конечной.
- С момента 4.14
val iter : ('a -> unit) -> 'a t -> unit
iter f xs вызывает f x последовательно для каждого элемента x последовательности xs, слева направо.
Завершается только если последовательность xs конечна.
val fold_left : ('acc -> 'a -> 'acc) -> 'acc -> 'a t -> 'acc
fold_left f _ xs вызывает f _ x последовательно для каждого элемента x последовательности xs, слева направо.
Аккумулятор типа 'a передаётся через вызовы f.
Завершается только если последовательность xs конечна.
val iteri : (int -> 'a -> unit) -> 'a t -> unit
iteri f xs вызывает f i x последовательно для каждого элемента x с индексом i в последовательности xs.
Завершается только если последовательность xs конечна.
iteri f xs эквивалентно iter (fun (i, x) -> f i x) (zip (ints 0) xs).
- С момента 4.14
val fold_lefti : ('acc -> int -> 'a -> 'acc) -> 'acc -> 'a t -> 'acc
fold_lefti f _ xs вызывает f _ i x последовательно для каждого элемента x с индексом i в последовательности xs.
Аккумулятор типа 'b передаётся через вызовы f.
Завершается только если последовательность xs конечна.
fold_lefti f accu xs эквивалентно fold_left (fun accu (i, x) -> f accu i x) accu (zip (ints 0) xs).
- С момента 4.14
val for_all : ('a -> bool) -> 'a t -> bool
for_all p xs определяет, удовлетворяют ли все элементы x последовательности xs условию p x.
Последовательность xs должна быть конечной.
- С момента 4.14
val exists : ('a -> bool) -> 'a t -> bool
exists xs p определяет, удовлетворяет ли хотя бы один элемент x последовательности xs условию p x.
Последовательность xs должна быть конечной.
- С момента 4.14
val find : ('a -> bool) -> 'a t -> 'a option
find p xs возвращает Some x, где x — первый элемент последовательности xs , удовлетворяющий условию p x, если такой элемент есть.
Возвращает None если такого элемента нет.
Последовательность xs должна быть конечной.
- С момента 4.14
val find_index : ('a -> bool) -> 'a t -> int option
find_index p xs возвращает Some i, где i это индекс первого элемента последовательности xs, удовлетворяющего p x, если такой элемент существует.
Возвращает None, если такого элемента нет.
Последовательность xs должна быть конечной.
- Since 5.1
val find_map : ('a -> 'b option) -> 'a t -> 'b option
find_map f xs возвращает Some y, где x это первый элемент последовательности xs, такой что f x = Some _, если такой элемент существует, и где y определяется как f x = Some y.
Возвращает None, если такого элемента нет.
Последовательность xs должна быть конечной.
- Since 4.14
val find_mapi : (int -> 'a -> 'b option) -> 'a t -> 'b option
То же, что и find_map, но предикат применяется к индексу элемента в качестве первого аргумента (нумерация с 0), а сам элемент — в качестве второго аргумента.
Последовательность xs должна быть конечной.
- Since 5.1
val iter2 : ('a -> 'b -> unit) -> 'a t -> 'b t -> unit
iter2 f xs ys вызывает f x y последовательно для каждой пары (x, y) элементов, синхронно извлекаемых из последовательностей xs и ys.
Если последовательности xs и ys имеют разную длину, то итерация прекращается, как только одна из последовательностей исчерпана; лишние элементы в другой последовательности игнорируются.
Итерация завершается только если хотя бы одна из последовательностей xs и ys конечна.
iter2 f xs ys эквивалентно iter (fun (x, y) -> f x y) (zip xs ys).
- Since 4.14
val fold_left2 : ('acc -> 'a -> 'b -> 'acc) -> 'acc -> 'a t -> 'b t -> 'acc
fold_left2 f _ xs ys вызывает f _ x y последовательно для каждой пары (x, y) элементов, синхронно извлекаемых из последовательностей xs и ys.
Аккумулятор типа 'a передаётся через вызовы f.
Если последовательности xs и ys имеют разную длину, то итерация прекращается, как только одна из последовательностей исчерпана; лишние элементы в другой последовательности игнорируются.
Итерация завершается только если хотя бы одна из последовательностей xs и ys конечна.
fold_left2 f accu xs ys эквивалентно fold_left (fun accu (x, y) -> f accu x y) (zip xs ys).
- Since 4.14
val for_all2 : ('a -> 'b -> bool) -> 'a t -> 'b t -> bool
for_all2 p xs ys определяет, удовлетворяют ли все пары (x, y) элементов, синхронно извлекаемых из последовательностей xs и ys, условию p x y.
Если последовательности xs и ys имеют разную длину, то итерация прекращается, как только одна из последовательностей исчерпана; лишние элементы в другой последовательности игнорируются. В частности, если xs или ys пуста, то for_all2 p xs ys истинно. Именно здесь for_all2 и equal различаются: equal eq xs ys может быть истинно только если xs и ys имеют одинаковую длину.
Хотя бы одна из последовательностей xs и ys должна быть конечной.
for_all2 p xs ys эквивалентно for_all (fun b -> b) (map2 p xs ys).
- Since 4.14
val exists2 : ('a -> 'b -> bool) -> 'a t -> 'b t -> bool
exists2 p xs ys определяет, удовлетворяет ли какая-либо пара (x, y) элементов, синхронно извлекаемых из последовательностей xs и ys, условию p x y.
Если последовательности xs и ys имеют разную длину, то итерация должна прекратиться, как только одна из последовательностей исчерпана; лишние элементы в другой последовательности игнорируются.
Хотя бы одна из последовательностей xs и ys должна быть конечной.
exists2 p xs ys эквивалентно exists (fun b -> b) (map2 p xs ys).
- Since 4.14
val equal : ('a -> 'b -> bool) -> 'a t -> 'b t -> bool
При условии, что функция eq определяет равенство элементов, equal eq xs ys определяет, являются ли последовательности xs и ys поэлементно равными.
Хотя бы одна из последовательностей xs и ys должна быть конечной.
- Since 4.14
val compare : ('a -> 'b -> int) -> 'a t -> 'b t -> int
При условии, что функция cmp определяет предпорядок на элементах, compare cmp xs ys сравнивает последовательности xs и ys в соответствии с лексикографическим предпорядком.
Для получения дополнительной информации о функциях сравнения см. Array.sort.
Хотя бы одна из последовательностей xs и ys должна быть конечной.
- Since 4.14
Создание последовательностей
Функции в этом разделе являются ленивыми: то есть они возвращают последовательности, элементы которых вычисляются только по требованию.
val empty : 'a t
empty это пустая последовательность. Она не имеет элементов. Её длина равна 0.
val return : 'a -> 'a t
return x это последовательность, единственным элементом которой является x. Её длина равна 1.
val cons : 'a -> 'a t -> 'a t
cons x xs это последовательность, которая начинается с элемента x, за которым следует последовательность xs.
Запись cons (f()) xs приводит к тому, что вызов функции f() происходит немедленно. Для того, чтобы этот вызов был отложен до запроса последовательности, следует написать (fun () -> Cons(f(), xs)).
- Since 4.11
val init : int -> (int -> 'a) -> 'a t
init n f это последовательность f 0; f 1; ...; f (n-1).
n должно быть неотрицательным.
При желании, бесконечная последовательность f 0; f 1; ... может быть определена как map f (ints 0).
- Since 4.14
-
Raises
Invalid_argumentеслиnотрицательно.
val unfold : ('b -> ('a * 'b) option) -> 'b -> 'a t
unfold создаёт последовательность из функции шага и начального состояния.
Если f u равно None, то unfold f u это пустая последовательность. Если f u равно Some (x, u'), то unfold f u это непустая последовательность cons x (unfold f u').
Например, unfold (function [] -> None | h :: t -> Some (h, t)) l эквивалентно List.to_seq l.
- Since 4.11
val repeat : 'a -> 'a t
repeat x это бесконечная последовательность, где элемент x повторяется бесконечно.
repeat x эквивалентно cycle (return x).
- Since 4.14
val forever : (unit -> 'a) -> 'a t
forever f это бесконечная последовательность, где каждый элемент создаётся (по требованию) вызовом функции f().
Например, forever Random.bool это бесконечная последовательность случайных битов.
forever f эквивалентно map f (repeat ()).
- Since 4.14
val cycle : 'a t -> 'a t
cycle xs это бесконечная последовательность, состоящая из бесконечного числа повторений последовательности xs.
Если xs это пустая последовательность, то cycle xs также пуста.
Потребление (префикса) последовательности cycle xs один раз может привести к тому, что последовательность xs будет потреблена более одного раза. Поэтому xs должна быть постоянной.
- Since 4.14
val iterate : ('a -> 'a) -> 'a -> 'a t
iterate f x это бесконечная последовательность, элементы которой равны x, f x, f (f x), и так далее.
Другими словами, это орбита функции f, начинающаяся с x.
- Since 4.14
Преобразование последовательностей
Функции в этом разделе являются ленивыми: то есть они возвращают последовательности, элементы которых вычисляются только по требованию.
val map : ('a -> 'b) -> 'a t -> 'b t
map f xs это образ последовательности xs при преобразовании f.
Если xs это последовательность x0; x1; ..., то map f xs это последовательность f x0; f x1; ....
val mapi : (int -> 'a -> 'b) -> 'a t -> 'b t
mapi аналогично map, но применяет функцию f к индексу и элементу.
mapi f xs эквивалентно map2 f (ints 0) xs.
- Since 4.14
val filter : ('a -> bool) -> 'a t -> 'a t
filter p xs это последовательность элементов x из xs, удовлетворяющих p x.
Другими словами, filter p xs это последовательность xs, лишённая элементов x, таких что p x ложно.
val filter_map : ('a -> 'b option) -> 'a t -> 'b t
filter_map f xs — это последовательность элементов y такая, что f x = Some y, где x принимает значения из xs.
filter_map f xs эквивалентно map Option.get (filter Option.is_some (map f xs)).
val scan : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b t
Если xs — это последовательность [x0; x1; x2; ...], то scan f a0 xs — это последовательность аккумуляторов [a0; a1; a2; ...], где a1 — это f a0 x0, a2 — это f a1 x1, и так далее.
Таким образом, scan f a0 xs концептуально связано с fold_left f a0 xs. Однако вместо выполнения жадной итерации и немедленного возвращения конечного аккумулятора, оно возвращает последовательность аккумуляторов.
Например, scan (+) 0 преобразует последовательность целых чисел в последовательность её частичных сумм.
Если xs имеет длину n, то scan f a0 xs имеет длину n+1.
- Since 4.14
val take : int -> 'a t -> 'a t
take n xs — это последовательность из первых n элементов xs.
Если xs содержит меньше, чем n элементов, то take n xs эквивалентно xs.
n должно быть неотрицательным.
- Since 4.14
-
Raises
Invalid_argumentеслиnотрицательно.
val drop : int -> 'a t -> 'a t
drop n xs — это последовательность xs, лишённая первых n элементов.
Если xs содержит меньше, чем n элементов, то drop n xs пуста.
n должно быть неотрицательным.
drop ленивая: первые n+1 элементов последовательности xs требуются только тогда, когда требуется первый элемент drop n xs. По этой причине, drop 1 xs не эквивалентно tail xs, которое запрашивает xs немедленно.
- Since 4.14
-
Raises
Invalid_argumentеслиnотрицательно.
val take_while : ('a -> bool) -> 'a t -> 'a t
take_while p xs — это наибольший префикс последовательности xs, где каждый элемент x удовлетворяет условию p x.
- Since 4.14
val drop_while : ('a -> bool) -> 'a t -> 'a t
drop_while p xs — это последовательность xs, лишённая префикса take_while p xs.
- Since 4.14
val group : ('a -> 'a -> bool) -> 'a t -> 'a t t
При условии, что функция eq определяет равенство элементов, group eq xs — это последовательность максимальных последовательностей одинаковых смежных элементов последовательности xs.
Каждый элемент group eq xs является непустой последовательностью равных элементов.
Конкатенация concat (group eq xs) равна xs.
Обращение к group eq xs, и к последовательностям, которые она содержит, может привести к тому, что xs будет обработана более одного раза. Поэтому xs должна быть персистентной.
- Since 4.14
val memoize : 'a t -> 'a t
Последовательность memoize xs содержит те же элементы, что и последовательность xs.
Независимо от того, является ли xs временной или персистентной, memoize xs является персистентной: даже если она запрашивается несколько раз, xs запрашивается не более одного раза.
Построение последовательности memoize xs внутренне использует приостановки, предоставляемые модулем Lazy. Эти приостановки не потокобезопасны. Поэтому к последовательности memoize xs нельзя обращаться из нескольких потоков одновременно.
- Since 4.14
exception Forced_twice
Это исключение возникает, когда последовательность, возвращённая Seq.once (или её суффикс) запрашивается более одного раза.
- Since 4.14
val once : 'a t -> 'a t
Последовательность once xs содержит те же элементы, что и последовательность xs.
Независимо от того, является ли xs временной или персистентной, once xs является временной последовательностью: к ней можно обратиться не более одного раза. Если она (или её суффикс) запрашивается более одного раза, то возникает исключение Forced_twice. Это может быть полезно при отладке или тестировании для обеспечения того, что к последовательности обращаются не более одного раза.
- Since 4.14
-
Raises
Forced_twiceеслиonce xs, или её суффикс, запрашивается более одного раза.
val transpose : 'a t t -> 'a t t
Если xss — матрица (последовательность строк), то transpose xss — это последовательность столбцов матрицы xss.
Строки матрицы xss не обязаны иметь одинаковую длину.
Матрица xss не обязана быть конечной (в любом направлении).
Матрица xss должна быть персистентной.
- Since 4.14
Объединение последовательностей
val append : 'a t -> 'a t -> 'a t
append xs ys — это конкатенация последовательностей xs и ys.
Её элементы — это элементы xs, за которыми следуют элементы ys.
- Since 4.11
val concat : 'a t t -> 'a t
Если xss — это последовательность последовательностей, то concat xss — это её конкатенация.
Если xss — это последовательность xs0; xs1; ..., то concat xss — это последовательность xs0 @ xs1 @ ....
- Since 4.13
val flat_map : ('a -> 'b t) -> 'a t -> 'b t
flat_map f xs эквивалентно concat (map f xs).
val concat_map : ('a -> 'b t) -> 'a t -> 'b t
concat_map f xs эквивалентно concat (map f xs).
concat_map — псевдоним для flat_map.
- Since 4.13
val zip : 'a t -> 'b t -> ('a * 'b) t
zip xs ys — это последовательность пар (x, y), взятых синхронно из последовательностей xs и ys.
Если последовательности xs и ys имеют разную длину, то последовательность завершается, как только одна из последовательностей исчерпана; лишние элементы в другой последовательности игнорируются.
zip xs ys эквивалентно map2 (fun a b -> (a, b)) xs ys.
- Since 4.14
val map2 : ('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t
map2 f xs ys — это последовательность элементов f x y, где пары (x, y) взяты синхронно из последовательностей xs и ys.
Если последовательности xs и ys имеют разную длину, то последовательность завершается, как только одна из последовательностей исчерпана; лишние элементы в другой последовательности игнорируются.
map2 f xs ys эквивалентно map (fun (x, y) -> f x y) (zip xs ys).
- Since 4.14
val interleave : 'a t -> 'a t -> 'a t
interleave xs ys — это последовательность, которая начинается с первого элемента xs, продолжает первым элементом ys, и так далее.
Когда одна из последовательностей xs и ys исчерпана, interleave xs ys продолжается с остальной частью другой последовательности.
- Since 4.14
val sorted_merge : ('a -> 'a -> int) -> 'a t -> 'a t -> 'a t
Если последовательности xs и ys отсортированы по общему упорядочению cmp, то sorted_merge cmp xs ys — это отсортированная последовательность, полученная путём слияния последовательностей xs и ys.
Подробнее о функциях сравнения см. Array.sort.
- Since 4.14
val product : 'a t -> 'b t -> ('a * 'b) t
product xs ys — это декартово произведение последовательностей xs и ys.
Для каждого элемента x последовательности xs и для каждого элемента y последовательности ys, пара (x, y) появляется один раз как элемент product xs ys.
Порядок появления пар не определён.
Последовательности xs и ys не обязаны быть конечными.
Последовательности xs и ys должны быть персистентными.
- Since 4.14
val map_product : ('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t
Последовательность map_product f xs ys представляет собой изображение через f декартова произведения последовательностей xs и ys.
Для каждого элемента x последовательности xs и для каждого элемента y последовательности ys, элемент f x y появляется один раз в качестве элемента map_product f xs ys.
Порядок, в котором эти элементы появляются, не определён.
Последовательности xs и ys не обязательно должны быть конечными.
Последовательности xs и ys должны быть персистентными.
map_product f xs ys эквивалентно map (fun (x, y) -> f x y) (product xs ys).
- Since 4.14
Разделение последовательности на две последовательности
val unzip : ('a * 'b) t -> 'a t * 'b t
unzip преобразует последовательность пар в пару последовательностей.
unzip xs эквивалентно (map fst xs, map snd xs).
Обращение к любой из последовательностей, возвращаемых unzip xs, приводит к обращению к xs. Следовательно, обращение к обеим из них приводит к двойному обращению к xs. Таким образом, xs должна быть персистентной и быстрой. Если это не так, используйте unzip (memoize xs).
- Since 4.14
val split : ('a * 'b) t -> 'a t * 'b t
split является псевдонимом для unzip.
- Since 4.14
val partition_map : ('a -> ('b, 'c) Either.t) -> 'a t -> 'b t * 'c t
partition_map f xs возвращает пару последовательностей (ys, zs), где:
-
ys— последовательность элементовy, удовлетворяющих условиюf x = Left y, гдеxпроходит поxs;
-
zs— последовательность элементовz, удовлетворяющих условиюf x = Right z, гдеxпроходит поxs.
partition_map f xs эквивалентно паре filter_map Either.find_left (map f xs) и filter_map Either.find_right (map f xs).
Обращение к любой из последовательностей, возвращаемых partition_map f xs, приводит к обращению к xs. Следовательно, обращение к обеим из них приводит к двойному обращению к xs. Таким образом, xs должна быть персистентной и быстрой. Если это не так, используйте partition_map f (memoize xs).
- Since 4.14
val partition : ('a -> bool) -> 'a t -> 'a t * 'a t
partition p xs возвращает пару подпоследовательностей элементов xs, удовлетворяющих условию p, и элементов xs, не удовлетворяющих условию p.
partition p xs эквивалентно filter p xs, filter (fun x -> not (p x)) xs.
Обработка обеих последовательностей, возвращаемых partition p xs, приводит к двойной обработке xs и двойному применению функции f к каждому элементу списка. Поэтому f должна быть чистой и быстрой. Кроме того, xs должна быть персистентной и быстрой. Если это не так, используйте partition p (memoize xs).
- Since 4.14
Преобразование между последовательностями и дисператорами
Дисператор — это представление последовательности как функции типа unit -> 'a option. Каждый вызов этой функции возвращает следующий элемент последовательности. Когда больше элементов нет, она возвращает None. Дисператор имеет изменяемое внутреннее состояние, поэтому является эфемерным: последовательность, которую он представляет, может быть обработана не более одного раза.
val of_dispenser : (unit -> 'a option) -> 'a t
of_dispenser it — это последовательность элементов, производимых дисператором it. Это эфемерная последовательность: она может быть обработана не более одного раза. Если нужна персистентная последовательность, используйте memoize (of_dispenser it).
- Since 4.14
val to_dispenser : 'a t -> unit -> 'a option
to_dispenser xs — это новый дисператор на последовательности xs.
Этот дисператор имеет изменяемое внутреннее состояние, которое не защищено блокировкой; поэтому его нельзя использовать несколькими потоками одновременно.
- Since 4.14
Последовательности целых чисел
val ints : int -> int t
ints i — бесконечная последовательность целых чисел, начинающаяся с i и увеличивающаяся.
- Since 4.14
© 1995-2024 INRIA.
https://ocaml.org/manual/5.2/api/Seq.html