Pergunta

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?

Foi útil?

Solução

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top