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

时间:2014-04-25 12:30:04

标签: ocaml lazy-evaluation

Lazy模块中有两种力量:


  

val force:'a t - > 'a

     

强制x强制悬架x并返回其结果。如果x有   已经被迫,Lazy.force x再次返回相同的值而没有   重新计算它。如果引发异常,则会出现同样的异常   再次提出。如果x的强制试图强制x,则提升未定义   本身递归。


  

val force_val:'a t - > 'a

     

force_val x强制暂停x并返回其结果。如果x有   已经被强制,force_val x再次返回相同的值而没有   重新计算它。如果x的强制试图强制x,则提升未定义   本身递归。如果x的计算引发异常,则为   未指定force_val x是否引发相同的异常或   未定义。


似乎唯一的区别是

  

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

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

那背后有什么意义呢?为什么这样做?我们可以从force_val获得任何好处吗?

1 个答案:

答案 0 :(得分:6)

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

正如您所见hereforceforce_val做同样的事情,但在发生异常时会执行额外的内存访问。

在阅读源代码并运行一些测试之后,这两个函数的行为似乎与文档所说的不同:如果仅使用force,则始终会得到原始错误,但如果使用{{1第一个调用将引发原始异常,并且对force_val force_val 的所有后续调用都将引发force

编辑:实际上,我不确定使用Undefined代替force_val可以提高性能,因为force是一个基元{{1}不是。