我在“Scala中的函数编程”一书中对Streams进行了练习,并且对某些行为感到有些困惑。我们有一个Stream特征定义如下:
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)
}
def empty[A]: Stream[A] = Empty
def apply[A](as: A*): Stream[A] =
if (as.isEmpty) empty else cons(as.head, apply(as.tail: _*))
}
然后说我做了以下事情:
def test(i: Int) = {println("i: " + i); i}
val stream = cons(test(1), cons(test(2), cons(test(3), empty)))
现在,当我以这种方式创建流时,实际上会对test(1)的调用进行评估。有人可以告诉我为什么评估这个而不是测试(2)和测试(3)?