为什么在 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 类 得到编译器为它们派生的自动方法实现,例如 equalshashCode,它们是根据 case [=26= 计算的] 。如何计算一个 hashCode 值,例如无限流?

可以在 Scala case class prohibits call-by-name parameters?

找到关于为什么 case 类 不能有名称参数的更完整的答案