ocaml中的懒惰评估

时间:2017-03-06 19:06:35

标签: 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>)

1 个答案:

答案 0 :(得分:0)

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

通俗地说,一个列表是一对有一个值和一个电话号码,你应该打电话来完成剩下的工作。因此,如果您需要更多值,则需要调用更多值,例如

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

当然,此功能永远不会终止,并会打印无限的数字序列。

关于您的示例,lseq 5是一个无限序列,如下所示:5, 6, 7, ...。它不是在记忆中急切地构建,而是更像是一个配方,如何构建序列。