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