我正在阅读“Scala 中的函数式编程”一书,并且遇到了一个我不完全理解的示例。
在关于严格/懒惰的章节中,作者描述了 Streams 的构造并有这样的代码:
sealed trait Stream[+A]
case object Empty extends Stream[Nothing]
case class Cons[+A](h: () => A, t: () => Stream[A]) extends Stream[A]
object Stream {
def cons[A](hd: => A, tl: => Stream[A]) : Stream[A] = {
lazy val head = hd
lazy val tail = tl
Cons(() => head, () => tail)
}
...
}
我的问题是在智能构造函数 ( cons
) 中,它调用Cons
案例类的构造函数。用于传递head
and tail
vals 的特定语法对我来说没有意义。为什么不像这样调用构造函数:
Cons(head, tail)
head
据我了解所使用的语法是强制创建两个仅返回和val的 Function0 对象tail
。这与仅传递head
和tail
(不带() =>
前缀)有何不同,因为Cons
案例类已经定义为按名称获取这些参数?这不是多余的吗?还是我错过了什么?