Attualmente sto imparando Scala lavorando sul libro "Programming in Scala". Finora, ci sono stati piacevoli spiegazioni per tutto ciò che sembra strano (dal punto di vista di un programmatore Java), ma questo esempio, utilizzando un flusso per generare la sequenza di Fibonacci mi lascia tipo di perplesso:In che modo Stream-cons # :: viene tradotto in Scala?
def fibFrom(a: Int, b: Int): Stream[Int] =
a #:: fibFrom(b, a + b)
Come è la costruzione del flusso fatto? Ovviamente l'operatore #::
è in qualche modo responsabile di ciò. Capisco che dal momento che termina in :
, è giusto-associativo, ma che non spiega la creazione del flusso. Immagino sia implicitamente tradotto in qualche modo da un costruttore, ma non vedo perché e come esattamente.
Ho già cercato risposte in Predef.scala
e LowPriorityImplicits.scala
ma finora non ho avuto fortuna.
Qualcuno può illuminarmi?
Grazie, è tutto. Ho dimenticato che le conversioni implicite possono anche essere definite nell'oggetto associato della classe che deve essere convertito. – rolve
Scaladoc dovrebbe probabilmente includere automaticamente gli impliciti associati hard-coded. – Debilski
Forse segnalare ad altri nuovi di Scala che non è giusto che sia giusto associare. È anche che ConsWrapper implementa '# ::' come [call-by-name] (https://github.com/scala/scala/blob/v2.10.3/src/library/scala/collection/immutable/Stream. Scala # L1042). cioè il '⇒' in' ConsWrapper (tl: ⇒ Stream [A]) 'in modo che la traduzione in' immutable.this.Stream.consWrapper (fibFrom (b, a + b)). #: :(a) ' 'FibFrom (b, a + b)' sarà sempre chiamato solo quando si accede. – nicerobot