懒惰评估意外行为

时间:2014-05-26 15:05:37

标签: scala functional-programming

我在“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)?

0 个答案:

没有答案