Я не буду вдаваться в подробности, может быть, этого будет достаточно для вас ... Это работает так же, как рекурсивные функции. Ленивые значения ведут себя как запомненные функции.
Более того, вы также можете сделать так, чтобы они работали как значения, но они не могут быть локальной переменной. Посмотрите, что
class Test {
val a = 5
val x: Stream[Int] = Cons(() => a, () => x)
}
компилируется просто отлично.