ocaml中的延迟计算

ocaml中的延迟计算,ocaml,lazy-evaluation,Ocaml,Lazy Evaluation,我不明白如何调用lseq函数使其永远运行 type 'a llist = LazyList of 'a * (unit -> 'a llist) let rec lseq nr = LazyList (nr, fun () -> lseq (nr+1)) 如果我打电话 lseq 5 我明白了 int llist = LazyList (5, <fun>) int-llist=LazyList(5,) 对lseq的每次调用都将构造一个类型为'a llist的

我不明白如何调用
lseq
函数使其永远运行

type 'a llist = LazyList of 'a * (unit -> 'a llist)
let rec lseq nr = 
    LazyList (nr, fun () -> lseq (nr+1))
如果我打电话

lseq 5
我明白了

int llist = LazyList (5, <fun>)
int-llist=LazyList(5,)

lseq
的每次调用都将构造一个类型为
'a llist
的新值。该值将由两部分组成。第一部分是列表元素,在此步骤中生成,第二部分是将生成列表其余部分的函数。然后函数还没有被调用,所以函数不会循环

用外行术语来说,列表是一对有一个值和一个电话号码的组合,您应该在其中打电话获取其余的值。因此,如果需要更多值,则需要调用更多值,例如

let rec print_lseq (LazyList (x,next)) = 
  print_int x;
  print_lseq (next ())
当然,此函数永远不会终止,并将打印无限的数字序列


关于你的例子,
lseq5
是一个无限序列,看起来像:
5,6,7,
。它不是急切地在内存中构建,而是更像一个配方,如何构建序列

你是说:“不会永远跑下去”吗?或者,让我们重新表述您的问题:“为什么对
lseq
函数的调用会终止?”这就是您想要问的问题吗?如果我调用lseq 5,它会给出int-llist=LazyList(5),它没有停止吗?