2017-03-06 68 views
0

我不明白我怎么能打电话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>) 
+0

您的意思是:“will not not run forever forever?”或者,让我们重述一下您的问题:“为什么要调用'lseq'函数终止?”那是你想问的吗? – ivg

+0

好吧,如果我打电话给lseq 5它给int llist = LazyList(5,)不是停止吗? – Oleg

回答

0

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

通俗地说,一个列表是一对有一个值和一个电话号码,你应该打电话来休息。所以,如果你需要更多的价值,你需要调用更多,例如,

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

当然,这一功能将永远不会终止,将打印数的无限序列。

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

+0

感谢您的简单和明确的解释 – Oleg