Module Lazy


module Lazy: sig  end
遅延評価です。


type 'a t = 'a lazy_t
'a Lazy.t の値は遅延評価で、suspension と呼ばれ、型 'a の結果を保持します。特別な式文法 lazy (expr)expr をその場では評価せずに、expr の評価の suspension を作成します。suspension を "Forcing" すると expr が評価され、その結果を返します。

Note: lazy_t はコンパイラが lazy キーワードのために使う built-in の型コンストラクタです。ユーザは lazy_t を直接使用せず、Lazy.t を使用して下さい。

Note: プログラムを -rectypes オプション付きでコンパイルした場合、let rec x = lazy xlet rec x = lazy(lazy(...(lazy x))) のような形をした正当性の薄い (ill-founded) 再帰的定義が型チェッカを通って、その値は force するとランタイムシステムのガベージコレクタやそれ以外の部分で無限ループに陥ってしまいます。-rectypes オプション無しの場合、このような正当性の薄い (ill-founded) 再帰的定義は型チェッカに拒否されます。


exception Undefined
val force : 'a t -> 'a
force x は suspension x を force し、その結果を返します。x が既に force されている場合は、Lazy.force x は再評価をせず同じ値を返します。例外が発生した場合は、再度同じ例外が発生します。x を force しているとき、再帰的に x 自身を force しようとした場合は例外 Undefined が発生します。
val force_val : 'a t -> 'a
force x は suspension x を force し、その結果を返します。x が既に force されている場合は、Lazy.force x は再評価をせず同じ値を返します。x を force しているとき、再帰的に x 自身を force しようとした場合は例外 Undefined が発生します。x の評価で例外が発生した場合、force_val x が同じ例外を発生するか、Undefined を発生するか決められていません。
val lazy_from_fun : (unit -> 'a) -> 'a t
lazy_from_fun flazy (f ()) と同じですが、少し効率的です。
val lazy_from_val : 'a -> 'a t
lazy_from_val v は既に force されている v の suspension を返します。これは特別な目的のためだけにあり、lazy (v) と取り違えないで下さい。
val lazy_is_val : 'a t -> bool
lazy_is_val xx が既に force されていて、例外を発生しなかった場合 true を返します。