在懒散模块中有两种力量:
val强制:'a t -> 'a强制x强制悬挂x并返回其结果。如果x已被强制,则Lazy.force x将再次返回相同的值,而无需重新计算它。如果它引发异常,则再次引发相同的异常。如果x的强迫试图递归地强制x本身,则引发未定义的异常。
val force_val :a -> 'a force_val x强制暂停x并返回其结果。如果x已被强制,则force_val x再次返回相同的值,而无需重新计算它。如果x的强迫试图递归地强制x本身,则引发未定义的值。如果x的计算引发异常,则未指定force_val x是否会引发相同的异常或未定义的异常。
似乎唯一不同的是
如果x的计算引发异常,则未指定force_val x是引发同一异常还是未定义。
根据我的理解,如果我们使用Undefined,我们不知道它是否会引发原始异常或force_val。
那这背后有什么意义?为什么要这样做?我们能从force_val那里得到的任何好处
发布于 2014-04-25 12:55:12
我想是为了表演。如果您关心获得相同的错误,请使用force。如果您不想获得更好的性能,请使用force_val。
正如您可以看到的,这里,force与force_val做同样的事情,但是在发生异常时执行对内存的额外访问。
在读取源代码和运行一些测试之后,这两个函数的行为似乎与文档中所说的不同:如果只使用force,则始终会得到原始错误,但如果使用force_val,则第一个调用将引发原始异常,而对force_val 或的所有后续调用都会引发Undefined。
编辑:实际上,我不确定使用force_val而不是force是否会提高性能,因为force是一个原语,而force_val不是。
https://stackoverflow.com/questions/23293234
复制相似问题