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

呼び出す場合、私はlseqへの各呼び出しはタイプ'a llistの新しい値を作成します

int llist = LazyList (5, <fun>) 
+0

「あなたは永遠に実行されませんか?あるいは、なぜ、 'lseq'関数の呼び出しが終了するのですか?という質問を言い換えてみましょう。それはあなたが尋ねたいものですか? – ivg

+0

私がlseq 5を呼び出すと、int llist = LazyList(5、)が終了しましたか? – Oleg

答えて

0

を取得します。値は2つの部分で構成されます。最初の部分はこのステップで生成されたリスト要素で、もう1つはリストの残りの部分を生成する関数です。関数がまだ呼び出されていないので、関数は繰り返されません。

リストで言えば、リストは1つの値を持つペアと電話番号で、残りの部分を取得するために呼び出す必要があります。ですから、複数の値が必要な場合は、例えば、より多くのを呼び出す必要があり、もちろん

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

、この機能は終了することはありませんし、数字の無限列を出力します。

lseq 5は、5, 6, 7, ...のような無限のシーケンスです。それは熱心にメモリに構築されているのではなく、むしろレシピのように、シーケンスをどのように構築するかです。

+0

シンプルで分かりやすい説明をありがとう – Oleg

関連する問題