为什么scala Vals默认不是懒惰的

时间:2015-07-17 08:58:22

标签: performance scala functional-programming lazy-evaluation

我注意到我几乎只使用lazy val分配,因为它们经常避免不必要的计算,而且我看不到很多情况下想要这样做(依赖)当然,可变变量是一个值得注意的例外。)

在我看来,这是函数式编程的一大优势,应该尽可能地鼓励它的使用,如果我理解正确的话,Haskell默认就是这样做的。

那么为什么Scala值默认不是懒惰的?是否只是为了避免与可变变量有关的问题?

3 个答案:

答案 0 :(得分:9)

Scala和Haskell之间的最大区别在于,Scala允许副作用,而Haskell则不然。

懒惰导致一种语言中的各种问题,这种问题允许在程序中的任意点产生副作用,因为副作用发生的顺序变得不确定。

几乎透明的Java互操作性在Scala的设计中起着重要作用,而Java库通常充满了副作用。

答案 1 :(得分:4)

Scala是一种严格的语言。懒惰不只是关于vals,而是关于评估策略。是否应在调用函数之前评估函数的参数(如果它们未被使用,会怎样?)?在Scala中(和大多数其他语言一样)它们都是。这种策略延续到其他环境,包括vals和vars。

打破vals的这个规则会很尴尬,但懒惰可能很有用,并作为选择加入提供。

答案 2 :(得分:1)

正如您所指出的,对可变变量的依赖是不兼容的,与惰性求值不兼容。 请注意,scala是JVM语言,Scala程序通常使用Java库,它们根本不起作用。默认情况下,惰性会导致Java库出现很多问题。