Задать вопрос
cs0ip
@cs0ip

Scala Stream

Может кто-нибудь пояснить подобный аспект работы потоков?
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), который уже позволяет отложить вычисления.

Вот этого перехода я пока никак не могу понять. Каким образом происходит замена одного метода другим?
И ещё отдельный вопрос, есть ли какой-то способ увидеть, какие методы были вызваны в итоге, чтобы было легче отследить подобные преобразования?
  • Вопрос задан
  • 4095 просмотров
Подписаться 2 Комментировать
Подписчики вопроса 2 К ответам на вопрос (0)