Scala Stream按需调用(懒惰)与按名称调用

时间:2013-05-06 20:47:35

标签: scala stream

所以我理解,按需调用只是一个按名称调用的memoized版本。在Martin Odersky的课程FP课程中,在7.3课程(懒惰评估)中,他提到如果使用按名称调用Streams,那么它可能会导致计算复杂性的爆炸。

这种爆炸的例子是什么?

通话按姓名:

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
  ...
}

1 个答案:

答案 0 :(得分:2)

例如Fibonacci系列,通过添加前两个元素来形成后继者。如果没有memoization,那么序列的长度就会出现线性减速(和堆栈增长):

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, ?)

this blog

复制的lazily(-sic-)示例