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

Вот этого перехода я пока никак не могу понять. Каким образом происходит замена одного метода другим?
И ещё отдельный вопрос, есть ли какой-то способ увидеть, какие методы были вызваны в итоге, чтобы было легче отследить подобные преобразования?
  • Вопрос задан
  • 4087 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
btd
@btd
6.12.3 не имеет отношение к #::. Это скорее о списковых операциях ::, :::. В скале если оператор начинается с: он автоматически становится право ассоцивными и выполняется от правого аргумента.
1 :: 2 :: 3 :: Nil // List[Int]().::(3).::(2).::(1)


Если посмотреть на код, то #:: это просто синоним к cons:
github.com/scala/scala/blob/v2.10.2/src/library/scala/collection/immutable/Stream.scala#L1042
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы