ocaml 中的懒惰评估

lazy evaluation in ocaml

我不明白如何调用 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>)

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

通俗地说,列表是具有一个值和一个 phone 数字的一对,您应该调用它来获取其余的。因此,如果您需要更多值,则需要调用更多,例如

let rec print_lseq (LazyList (x,next)) = 
  print_int x;
  print_lseq (next ())

当然,这个函数永远不会终止,并且会打印无限的数字序列。

关于你的例子,lseq 5 是一个无限序列,看起来像:5, 6, 7, ...。它不是在记忆中急切构建的,而是更像是一个菜谱,如何构建序列。