我不明白我怎么能调用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>)
答案 0 :(得分:0)
每次调用lseq
都会构建一个'a llist
类型的新值。该值将由两部分组成。第一部分是在此步骤中生成的列表元素,第二部分是将生成列表其余部分的函数。然后该函数尚未被调用,因此该函数不会循环。
通俗地说,一个列表是一对有一个值和一个电话号码,你应该打电话来完成剩下的工作。因此,如果您需要更多值,则需要调用更多值,例如
let rec print_lseq (LazyList (x,next)) =
print_int x;
print_lseq (next ())
当然,此功能永远不会终止,并会打印无限的数字序列。
关于您的示例,lseq 5
是一个无限序列,如下所示:5, 6, 7, ...
。它不是在记忆中急切地构建,而是更像是一个配方,如何构建序列。