我不明白我怎麼能打電話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