为什么在定义Streams iin Scala时必须明确强制使用thunk?

时间:2018-02-15 09:38:13

标签: scala lazy-evaluation thunk

我正在阅读有关Streams的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]。但是所谓的“技术限制”是什么阻止了这一点?

1 个答案:

答案 0 :(得分:4)

  

但是所谓的“技术限制”是什么阻止了这一点?

技术限制是目前(从Scala 2.12.x开始),Scala不支持lazy val参数或案例类上的名称参数。

为什么呢?由于案例类得到了编译器为它们派生的自动方法实现,例如equalshashCode,它们是根据案例类计算的 values 。如何计算hashCode值,例如,无限流?

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

找到关于为什么案例类不能通过名称参数获得的更全面的答案