【问题标题】: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 库出现很多问题。

      【讨论】:

        猜你喜欢
        • 2015-09-06
        • 2012-11-04
        • 1970-01-01
        • 1970-01-01
        • 2021-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多