发布于 2017-01-22 00:45:24
评价战略的名称有一定的广泛性,但大致可以归结为:
() -> a类型的函数。但是,由于引用的透明性,这有点模糊--您将无法像使用Scala那样测试它(编译器可能会优化调用的"by name“部分)。那么,如果按需要调用(懒散)所做的评估与其他任何一种策略一样多或更少,那么为什么还要使用其他方法呢?
除非您具有引用透明度,否则懒散的评估很难推理,因为您需要准确地确定什么时候对懒惰值进行了计算。由于Scala是为与Java互操作而构建的,所以它需要支持命令式的、副作用的编程.因此,在许多情况下,在Scala中使用lazy并不是一个好主意。
此外,lazy还有性能开销:您需要额外的间接检查值是否已经评估过。在Scala中,这转化为一组更多的对象,这给垃圾收集器带来了更大的压力。
最后,在有些情况下,延迟计算会留下“空间”漏洞。例如,在Haskell中,将一大串数字从右边叠加在一起是个坏主意,因为Haskell会在对(+)进行评估之前建立一系列庞大的懒散调用(实际上,您只需要它有一个累加器。即使在简单的上下文中,空间问题的一个著名例子是foldl'。
发布于 2017-01-22 08:02:09
这可能很有用,也不太适合评论。
您可以在Scala中编写一个函数,它的行为类似于Haskell的逐需要调用(用于参数),方法是按名称调用参数,并在函数开始时懒洋洋地对它们进行评估:
def foo(x: => Int) = {
lazy val _x = x
// make sure you only use _x below, not x
}https://stackoverflow.com/questions/41785985
复制相似问题