2017-03-06 95 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