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 x
や let 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 f
は lazy (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 x
は x
が既に force されていて、例外を発生しなかった場合 true
を返します。