我注意到我几乎只使用lazy val
分配,因为它们经常避免不必要的计算,而且我看不到很多情况下不想要这样做(依赖)当然,可变变量是一个值得注意的例外。)
在我看来,这是函数式编程的一大优势,应该尽可能地鼓励它的使用,如果我理解正确的话,Haskell默认就是这样做的。
那么为什么Scala值默认不是懒惰的?是否只是为了避免与可变变量有关的问题?
答案 0 :(得分:9)
Scala和Haskell之间的最大区别在于,Scala允许副作用,而Haskell则不然。
懒惰导致一种语言中的各种问题,这种问题允许在程序中的任意点产生副作用,因为副作用发生的顺序变得不确定。
几乎透明的Java互操作性在Scala的设计中起着重要作用,而Java库通常充满了副作用。
答案 1 :(得分:4)
Scala是一种严格的语言。懒惰不只是关于vals,而是关于评估策略。是否应在调用函数之前评估函数的参数(如果它们未被使用,会怎样?)?在Scala中(和大多数其他语言一样)它们都是。这种策略延续到其他环境,包括vals和vars。
打破vals的这个规则会很尴尬,但懒惰可能很有用,并作为选择加入提供。
答案 2 :(得分:1)
正如您所指出的,对可变变量的依赖是不兼容的,与惰性求值不兼容。 请注意,scala是JVM语言,Scala程序通常使用Java库,它们根本不起作用。默认情况下,惰性会导致Java库出现很多问题。