В настоящее время я изучаю Scala, работая над книгой «Программирование в Скале». До сих пор были хорошие объяснения всего, что выглядит странно (с точки зрения программиста Java), но это один из примеров использования потока для создания последовательности Фибоначчи оставляет меня вид недоумевают:Каким образом Stream-cons # :: переведен в Scala?
def fibFrom(a: Int, b: Int): Stream[Int] =
a #:: fibFrom(b, a + b)
Как строительство потока? Конечно, оператор #::
как-то ответственен за это. Я понимаю, что, поскольку он заканчивается в :
, он является право-ассоциативным, но это не объясняет создание Stream. Я предполагаю, что это неявно переводится конструктору, но я не понимаю, почему и как именно.
Я уже искал ответы в Predef.scala
и LowPriorityImplicits.scala
, но пока не повезло.
Может ли кто-нибудь просветить меня?
Спасибо, все. Я забыл, что неявные преобразования также могут быть определены в сопутствующем объекте класса, который должен быть преобразован. – rolve
Scaladoc должен, вероятно, автоматически включать эти жестко закодированные сопутствующие импликации. – Debilski
Возможно, укажите другим, знакомым с Scala, что это не так просто, что это право-ассоциативный. Кроме того, ConsWrapper реализует '# ::' как [call-by-name] (https://github.com/scala/scala/blob/v2.10.3/src/library/scala/collection/immutable/Stream. # L1042 Ла Скала). т.е. '⇒' в' ConsWrapper (tl: ⇒ Stream [A]) ', так что перевод в' immutable.this.Stream.consWrapper (fibFrom (b, a + b)). #: :(a) 'означает 'fibFrom (b, a + b)' будет когда-либо вызываться только при доступе. – nicerobot