为什么在Scala中定义流时必须显式强制thunk?

为什么在Scala中定义流时必须显式强制thunk?,scala,lazy-evaluation,thunk,Scala,Lazy Evaluation,Thunk,我正在读一本关于流的Scala教科书 sealed trait Stream[+A] case object Empty extends Stream[Nothing] case class Cons[+A](h: () => A, t: () => Stream[A]) extends Stream[A] 教科书上写着 由于技术上的限制,这些都是必须 显式强制,而不是按名称参数 我想教科书的意思是h:=>A,t:=>Stream[A]不应该被h:=>A,t:=>Stream[A]

我正在读一本关于流的Scala教科书

sealed trait Stream[+A]
case object Empty extends Stream[Nothing]
case class Cons[+A](h: () => A, t: () => Stream[A]) extends Stream[A]
教科书上写着

由于技术上的限制,这些都是必须 显式强制,而不是按名称参数

我想教科书的意思是h:=>A,t:=>Stream[A]不应该被h:=>A,t:=>Stream[A]替换。但什么是所谓的技术限制,禁止这一点

但什么是所谓的技术限制,禁止这一点

技术上的限制是,从Scala 2.12.x开始,Scala不支持案例类上的惰性val参数或按名称参数

为什么??由于case类得到编译器为其派生的自动方法实现,例如equals和hashCode,它们是根据case类的值计算出来的。如何计算hashCode值,例如,无限流

关于为什么case类不能有by-name参数的更完整的答案可以在