Lazy(3)
okay so bestie, welcome to the Lazy(3) page from the OCaml library β we're talking deferred computations, and it is literally giving main character energy. π¦β¨
π NAME π
Lazy β Deferred computations. π€β¨
π§Έ Module π§Έ
Module Lazy
β¨ Documentation β¨
Module Lazy : sig end
Deferred computations. π
type 'a t = 'a CamlinternalLazy.t
A value of type 'a Lazy.t is a deferred computation, called a suspension, that has a result of type 'a. Not me explaining this in the group chat, but okay: the special expression syntax lazy (expr) makes a suspension of the computation of expr, without computing expr itself yet. "Forcing" the suspension will then compute expr and return its result. Matching a suspension with the special pattern syntax lazy(pattern) also computes the underlying expression and tries to bind it to pattern:
let lazy_option_map f x =
match x with
| lazy (Some x) -> Some (Lazy.force f x)
| _ -> None
β οΈ Note: Iflazypatterns 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 suspensionxis 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.force is not concurrency-safe. If you use this module with multiple fibers, systhreads or domains, then you will need to add some locks. The module however ensures memory-safety, and hence, concurrently accessing this module will not lead to a crash but the behaviour is unspecified. π
π 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. π
exception Undefinedβ Raised when forcing a suspension concurrently from multiple fibers, systhreads or domains, or when the suspension tries to force itself recursively. π«Άval force : 'a t -> 'aβforce 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. RaisesUndefined(seeLazy.Undefined). π
π Iterators π
val map : ('a -> 'b) -> 'a t -> 'b tβmap f xreturns a suspension that, when forced, forcesxand appliesfto its value. It is equivalent tolazy (f (Lazy.force x)). Since 4.13 β¨
π§ Reasoning on already-forced suspensions π§
val is_val : 'a t -> boolβis_val xreturnstrueifxhas already been forced and did not raise an exception. Since 4.00 πval from_val : 'a -> 'a tβfrom_val vevaluatesvfirst (as any function would) and returns an already-forced suspension of its result. It is the same aslet x = v in lazy x, but uses dynamic tests to optimize suspension creation in some cases. Since 4.00 πΈval map_val : ('a -> 'b) -> 'a t -> 'b tβmap_val f xappliesfdirectly ifxis already forced, otherwise it behaves asmap f x. Whenxis already forced, this behavior saves the construction of a suspension, but on the other hand β highkey β it performs more work eagerly that may not be useful if you never force the function result. Iffraises an exception, it will be raised immediately whenis_val x, or raised only when forcing the thunk otherwise. Ifmap_val f xdoes not raise an exception, thenis_val (map_val f x)is equal tois_val x. Since 4.13 π₯
π§ Advanced π§
The following definitions are for advanced uses only; they require familiarity with the lazy compilation scheme to be used appropriately. No cap. π§
val from_fun : (unit -> 'a) -> 'a tβ The way thatfrom_fun fslays is: it's the same aslazy (f ())but slightly more efficient. It should 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 βval force_val : 'a t -> 'aβforce_val xforces the suspensionxand returns its result. Ifxhas already been forced,force_val xreturns the same value again without recomputing it. If the computation ofxraises an exception, it is unspecified whetherforce_val xraises the same exception orLazy.Undefined. RaisesUndefinedif the forcing ofxtries to forcexitself recursively. RaisesUndefined(seeLazy.Undefined). π«Άmodule Mutexed : sig endβ that's the whole module signature, bestie. π
okay that's the whole page, mwah π β brought to you by OCamldoc (source/version) and dated 2026-06-22. Periodt. π β¨
π¦ where this page comes from
- arch rolling: ocaml 5.5.0-1 Β· LGPL2.1 AND custom: QPL-1.0
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms