所以我知道按需调用只是按名称调用的记忆版本。在 Martin Odersky 在 Coursera 上的 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
...
}