`Lazy.force`和`Lazy.force_val`之间的区别

Jac*_*ale 6 ocaml lazy-evaluation

Lazy模块中有两种力量:


val force:'at - >'a

force x强制悬架x并返回其结果.如果x已被强制,则Lazy.force x将再次返回相同的值,而不重新计算它.如果它引发异常,则再次引发相同的异常.如果强制x尝试递归强制x本身,则提升未定义.


val force_val:'at - >'a

force_val x强制暂停x并返回其结果.如果x已经被强制,则force_val x再次返回相同的值而不重新计算它.如果强制x尝试递归强制x本身,则提升未定义.如果x的计算引发异常,则未指定force_val x是引发相同的异常还是Undefined.


似乎唯一不同的是

如果x的计算引发异常,则未指定force_val x是引发相同的异常还是Undefined.

根据我的理解,我们不知道它是否会引起原始异常或Undefined我们是否使用force_val.

那背后有什么意义呢?为什么这样做?我们能得到force_val什么好处?

Tho*_*ash 6

我想这是出于性能目的.如果您关心获得相同的错误,请使用force.如果您不想但想要更好的性能,请使用force_val.

正如您在此处所看到的,force执行相同的操作force_val但在发生异常时执行对内存的额外访问.

在阅读源代码并运行一些测试之后,这两个函数的行为似乎与文档所说的不同:如果您只使用force,您将始终获得原始错误,但如果您使用force_val第一个调用将引发原始异常,并且所有后续打电话force_val force将要提出Undefined.

编辑:实际上,我不确定使用force_val而不是force提高性能,因为force是原始的,force_val而不是.