Может кто-нибудь пояснить подобный аспект работы потоков?
scala> 1 #:: (null:Stream[Int])
res5: scala.collection.immutable.Stream[Int] = Stream(1, ?)
Покоя мне не дают следующие факты:
Scala reference, 6.12.3
If op is right-associative, the same operation is interpreted as { val x = e1; e2.op(x) },
where x is a fresh name.
Scala by example, 12
Two methods in class List which are not supported by class Stream are :: and :::.
The reason is that these methods are dispatched on their right-hand side argument,
which means that this argument needs to be evaluated before the method is called.
...
Instead of x :: xs, one uses Stream.cons(x, xs) for constructing a stream with
first element x and (unevaluated) rest xs.
Т.е. из этого видно, что аргумент справа должен быть вычислен, прежде чем на нем будет выполнен метод #::. При этом также очевидно что этого не происходит и каким-то образом вместо него вызывается метод Stream.cons(x, xs), который уже позволяет отложить вычисления.
Вот этого перехода я пока никак не могу понять. Каким образом происходит замена одного метода другим?
И ещё отдельный вопрос, есть ли какой-то способ увидеть, какие методы были вызваны в итоге, чтобы было легче отследить подобные преобразования?