从iter函数构建序列

时间:2018-04-25 09:22:03

标签: ocaml

我想从iter函数构建一个序列。我并没有真正了解它是如何工作的:

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

任何人都可以解释这是如何工作的吗?我想我应该把它传递给from_fun并在函数内部声明应该带参数的函数f。是吗?

1 个答案:

答案 0 :(得分:2)

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