Итераторы типа 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
.