Scala流按需调用(惰性)与按名称调用

Scala流按需调用(惰性)与按名称调用,scala,stream,Scala,Stream,所以我理解“按需呼叫”只是“按姓名呼叫”的一个记忆版本。在Martin Odersky关于Coursera的FP课程中,在第7.3课(惰性评估)中,他提到如果流是使用名称调用实现的,那么它可能会导致计算复杂性的膨胀 这种爆炸的例子是什么 点名: def cons[T](hd: T, tl: => Stream[T]) = new Stream[T] { def head = hd def tail = tl ... } 按需要致电: def cons[T](hd: T, tl

所以我理解“按需呼叫”只是“按姓名呼叫”的一个记忆版本。在Martin Odersky关于Coursera的FP课程中,在第7.3课(惰性评估)中,他提到如果流是使用名称调用实现的,那么它可能会导致计算复杂性的膨胀

这种爆炸的例子是什么

点名:

def cons[T](hd: T, tl: => Stream[T]) = new Stream[T] {
  def head = hd
  def tail = tl
  ...
}
按需要致电:

def cons[T](hd: T, tl: => Stream[T]) = new Stream[T] {
  def head = hd
  lazy val tail = tl
  ...
}

例如,斐波那契数列,通过将前两个元素相加形成后继元素来实现。如果不进行记忆,则序列长度会出现线性减速(和堆栈增长):

scala> lazy val fib: Stream[Int] = Stream.cons(0,
     | Stream.cons(1, fib.zip(fib.tail).map(p => p._1 + p._2)))
fib: Stream[Int] = Stream(0, ?)

示例延迟(-sic-)复制自

请检查链接,