There are two forces in Lazy module:
val force : 'a t -> 'a
force x forces the suspension x and returns its result. If x has already been forced, Lazy.force x returns the same value again without recomputing it. If it raised an exception, the same exception is raised again. Raise Undefined if the forcing of x tries to force x itself recursively.
val force_val : 'a t -> 'a
force_val x forces the suspension x and returns its result. If x has already been forced, force_val x returns the same value again without recomputing it. Raise Undefined if the forcing of x tries to force x itself recursively. If the computation of x raises an exception, it is unspecified whether force_val x raises the same exception or Undefined.
It seems the only diff is
If the computation of x raises an exception, it is unspecified whether force_val x raises the same exception or Undefined.`
From my understanding, we don't know whether it will raise original exception or Undefined
if we use force_val
.
Then what's the point behind this? Why make it this way? Any good we can get from force_val
?
I guess it is for performance purpose.
If you care about getting the same error, use force
. If you don't but want better performance, use force_val
.
As you can see here, force
does the same thing as force_val
but performs an extra access to memory in case an exception occurs.
After reading the source and running some tests, the behaviour of these two functions seems different from what the doc says : If you use only force
, you will always get the original error but if you use force_val
the first call will raise the original exception and all subsequent calls to force_val
or force
will raise Undefined
.
EDIT: Actually, I'm not sure that using force_val
instead of force
improves performance since force
is a primitive and force_val
is not.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With