我不明白我怎么能打电话lseq
函数,以便它将永远运行。在ocaml中的懒惰评价
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
函数,以便它将永远运行。在ocaml中的懒惰评价
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
类型的新价值。该值将由两部分组成。第一部分是一个列表元素,在此步骤中生成,第二部分是一个将生成列表的其余部分的函数。然后函数还没有被调用,所以函数不会循环。
通俗地说,一个列表是一对有一个值和一个电话号码,你应该打电话来休息。所以,如果你需要更多的价值,你需要调用更多,例如,
let rec print_lseq (LazyList (x,next)) =
print_int x;
print_lseq (next())
当然,这一功能将永远不会终止,将打印数的无限序列。
什么关于你的例子,lseq 5
是一个无限序列,看起来像:5, 6, 7, ...
。它不是在记忆中急切地构建的,而是更像是一个配方,如何构建序列。
感谢您的简单和明确的解释 – Oleg
您的意思是:“will not not run forever forever?”或者,让我们重述一下您的问题:“为什么要调用'lseq'函数终止?”那是你想问的吗? – ivg
好吧,如果我打电话给lseq 5它给int llist = LazyList(5,)不是停止吗? –
Oleg