【问题标题】:Why are scala Vals not lazy by default为什么scala Vals默认不懒惰
【发布时间】:2015-07-17 08:58:22
【问题描述】:
我注意到我几乎只使用lazy val 赋值,因为它们通常会避免不必要的计算,而且我看不出有很多情况不想要这样做(依赖于 mutable变量当然是一个值得注意的例外)。
在我看来,这是函数式编程的一大优势,应该尽可能鼓励使用它,如果我理解正确的话,Haskell 默认就是这样做的。
那么为什么 Scala 值默认不惰性呢?仅仅是为了避免与可变变量有关的问题吗?
【问题讨论】:
标签:
performance
scala
functional-programming
lazy-evaluation
【解决方案1】:
Scala 和 Haskell 之间的最大区别在于 Scala 允许副作用,而 Haskell 不允许。
在允许在程序中任意点产生副作用的语言中,惰性会导致各种问题,因为副作用发生的顺序变得不确定。
近乎透明的 Java 互操作性在 Scala 的设计中发挥着重要作用,而 Java 库通常充满副作用。
【解决方案2】:
Scala 是一门严格的语言。懒惰不仅与 vals 有关,还与评估策略有关。函数的参数是否应该在调用函数之前评估(如果不使用它们怎么办?)?在 Scala(像大多数其他语言一样)中它们是。此策略适用于其他上下文,包括 vals 和 vars。
为 val 打破这条规则会很尴尬,但懒惰是有用的,可以作为一种选择加入。
【解决方案3】:
正如您所指出的,对可变变量的依赖与惰性求值不兼容。
请注意,scala 是 JVM 语言,Scala 程序经常使用 Java 库,它们根本没有功能。默认情况下,惰性会导致 Java 库出现很多问题。