module Lazy:遅延計算sig
..end
type'a
t ='a lazy_t
'a Lazy.t
型の値は、中断(suspension)と呼ばれる、 'a
型の結果を返す遅延計算です。
lazy (expr)
という特殊な式の構文は、 expr
自体は計算せずに、 expr
に対する中断を作成します。
中断を強制評価(force)すると expr
を計算し、その結果を返します。
注意: lazy_t
はコンパイラが予約語 lazy
に対して使うための組み込みの型で、利用者が直接使うべきものではありません。常に Lazy.t
を使ってください。
注意: Lazy.force
はスレッドセーフではありません。このモジュールをマルチスレッドプログラムで使うためには何らかのロックを追加する必要があります。
注意: プログラムを -rectypes
オプションを指定してコンパイルすると、
let rec x = lazy x
や let rec x = lazy(lazy(...(lazy x)))
といったような
ill-founded な再帰的定義が型検査を通り、それを強制評価すると、ガーベジコレクターや実行システムの別の部分で無限ループを引き起こすような不正な値になります。
-rectypes
オプションを使わなければ、このような ill-founded な定義は型検査を通りません。
exception Undefined
val force : 'a t -> 'a
force x
は中断 x
を強制評価し、その結果を返します。 x
が既に評価されていた場合には、 Lazy.force x
は再計算を行なわずに同じ値を返します。
計算中に例外が発生した場合には、再評価時にも同じ例外が発生します。
x
を強制評価しているときに x
自体を再帰的に強制評価しようとすると Undefined
例外が発生します。val force_val : 'a t -> 'a
force x
は中断 x
を強制評価し、その結果を返します。 x
が既に評価されていた場合には、 Lazy.force x
は再計算を行なわずに同じ値を返します。
x
を強制評価しているときに x
自体を再帰的に強制評価しようとすると 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
を返します。
これは特別な目的のために使うもので、 lazy (v)
と混同してはいけません。val lazy_is_val : 'a t -> bool
lazy_is_val x
は x
が既に評価されていて、例外を発生させない場合に true
を返します。