Создайте последовательность из функции iter - PullRequest
0 голосов
/ 25 апреля 2018

Я хочу построить последовательность из функции iter.Я не совсем понял, как это работает:

 (('a ‑> unit) ‑> unit) ‑> 'a t

Кто-нибудь может объяснить, как это работает, пожалуйста?Я думаю, что я должен просто передать iter в from_fun и внутри функции объявить функцию f, которая должна принимать параметр.Это верно?

1 Ответ

0 голосов
/ 25 апреля 2018

Итераторы типа type 'a iter = ('a -> unit) -> unit являются внутренними итераторами: при использовании они итерируют во всей базовой последовательности и возвращают управление вызывающей стороне только в конце последовательности.Напротив, тип последовательности является внешним итератором, который возвращает управление вызывающей стороне после каждого шага.Легко перейти от внешнего итератора к внутреннему итератору с

let rec to_iter seq f = match seq () with
| Nil -> ()
| Cons(x, seq) -> f x; to_iter seq f

, потому что это означает отказ от контроля, который у вас есть.Другое направление не может работать так же хорошо, поскольку нет способа синхронизировать итерации iter с шагами последовательности.Единственное решение состоит в том, чтобы сохранить всю коллекцию, которая подвергается итерации, и затем преобразовать ее в последовательность, по существу, делая iter |> to_list |> List.to_seq.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...