为什么在 Scala 中定义 Streams 时必须显式强制使用 thunk?
Why thunks must be explicitly forced when you define Streams iin Scala?
我正在阅读有关 Streams 的 Scala 教科书
sealed trait Stream[+A]
case object Empty extends Stream[Nothing]
case class Cons[+A](h: () => A, t: () => Stream[A]) extends Stream[A]
课本上写着
"Due to technical limitations, these are thunks that must be
explicitly forced, rather than by-name parameters. "
我想教科书上的意思是h: ()=>A, t: ()=>Stream[A]
不应该被h: =>A, t: =>Stream[A]
代替。但是所谓的"technical limitations"禁止这个是什么?
But what are the so-called "technical limitations" that prohibit this?
技术限制是目前(从 Scala 2.12.x 开始),Scala 不支持 lazy val
参数或 case [=26= 上的名称参数].
为什么?由于 case 类 得到编译器为它们派生的自动方法实现,例如 equals
和 hashCode
,它们是根据 case [=26= 计算的] 值。如何计算一个 hashCode 值,例如无限流?
可以在 Scala case class prohibits call-by-name parameters?
找到关于为什么 case 类 不能有名称参数的更完整的答案
我正在阅读有关 Streams 的 Scala 教科书
sealed trait Stream[+A]
case object Empty extends Stream[Nothing]
case class Cons[+A](h: () => A, t: () => Stream[A]) extends Stream[A]
课本上写着
"Due to technical limitations, these are thunks that must be explicitly forced, rather than by-name parameters. "
我想教科书上的意思是h: ()=>A, t: ()=>Stream[A]
不应该被h: =>A, t: =>Stream[A]
代替。但是所谓的"technical limitations"禁止这个是什么?
But what are the so-called "technical limitations" that prohibit this?
技术限制是目前(从 Scala 2.12.x 开始),Scala 不支持 lazy val
参数或 case [=26= 上的名称参数].
为什么?由于 case 类 得到编译器为它们派生的自动方法实现,例如 equals
和 hashCode
,它们是根据 case [=26= 计算的] 值。如何计算一个 hashCode 值,例如无限流?
可以在 Scala case class prohibits call-by-name parameters?
找到关于为什么 case 类 不能有名称参数的更完整的答案