所以我理解,按需调用只是一个按名称调用的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
...
}
答案 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, ?)
复制的lazily(-sic-)示例