Module Caml.Lazy
type 'a t= 'a CamlinternalLazy.tA value of type
'a Lazy.tis a deferred computation, called a suspension, that has a result of type'a. The special expression syntaxlazy (expr)makes a suspension of the computation ofexpr, without computingexpritself yet. "Forcing" the suspension will then computeexprand return its result. Matching a suspension with the special pattern syntaxlazy(pattern)also computes the underlying expression and tries to bind it topattern:let lazy_option_map f x = match x with | lazy (Some x) -> Some (Lazy.force f x) | _ -> NoneNote: If lazy patterns appear in multiple cases in a pattern-matching, lazy expressions may be forced even outside of the case ultimately selected by the pattern matching. In the example above, the suspension
xis always computed.Note:
lazy_tis the built-in type constructor used by the compiler for thelazykeyword. You should not use it directly. Always useLazy.tinstead.Note:
Lazy.forceis not thread-safe. If you use this module in a multi-threaded program, you will need to add some locks.Note: if the program is compiled with the
-rectypesoption, ill-founded recursive definitions of the formlet rec x = lazy xorlet rec x = lazy(lazy(...(lazy x)))are accepted by the type-checker and lead, when forced, to ill-formed values that trigger infinite loops in the garbage collector and other parts of the run-time system. Without the-rectypesoption, such ill-founded recursive definitions are rejected by the type-checker.
val force : 'a t -> 'aforce xforces the suspensionxand returns its result. Ifxhas already been forced,Lazy.force xreturns the same value again without recomputing it. If it raised an exception, the same exception is raised again. RaiseUndefinedif the forcing ofxtries to forcexitself recursively.
val force_val : 'a t -> 'aforce_val xforces the suspensionxand returns its result. Ifxhas already been forced,force_val xreturns the same value again without recomputing it. RaiseUndefinedif the forcing ofxtries to forcexitself recursively. If the computation ofxraises an exception, it is unspecified whetherforce_val xraises the same exception orUndefined.
val from_fun : (unit -> 'a) -> 'a tfrom_fun fis the same aslazy (f ())but slightly more efficient.from_funshould only be used if the functionfis already defined. In particular it is always less efficient to writefrom_fun (fun () -> expr)thanlazy expr.- since
- 4.00.0
val from_val : 'a -> 'a tfrom_val vreturns an already-forced suspension ofv. This is for special purposes only and should not be confused withlazy (v).- since
- 4.00.0
val is_val : 'a t -> boolis_val xreturnstrueifxhas already been forced and did not raise an exception.- since
- 4.00.0
val lazy_from_fun : (unit -> 'a) -> 'a t- deprecated
synonym for
from_fun.
val lazy_from_val : 'a -> 'a t- deprecated
synonym for
from_val.
val lazy_is_val : 'a t -> bool- deprecated
synonym for
is_val.