Actualmente estoy aprendiendo Scala trabajando en el libro "Programación en Scala". Hasta ahora, no han sido buenas explicaciones para todo lo que se ve raro (desde la perspectiva de un programador de Java), pero este ejemplo utilizando una corriente para generar la secuencia de Fibonacci me deja tipo de perplejo:¿Cómo se traduce Stream-cons # :: en Scala?
def fibFrom(a: Int, b: Int): Stream[Int] =
a #:: fibFrom(b, a + b)
¿Cómo es la construcción de la corriente? Por supuesto, el operador #::
es de alguna manera responsable de eso. Entiendo que, dado que termina en :
, es de asociación correcta, pero eso no explica la creación de la transmisión. Supongo que está traducido implícitamente a un constructor de alguna manera, pero no veo por qué y cómo exactamente.
Ya he buscado respuestas en Predef.scala
y LowPriorityImplicits.scala
pero hasta ahora no tuve suerte.
¿Alguien puede aclararme?
Gracias, eso es todo. Olvidé que las conversiones implícitas también se pueden definir en el objeto complementario de la clase que se debe convertir. – rolve
Scaladoc probablemente debería incluir automáticamente las implicidades complementarias codificadas. – Debilski
Quizás señale a otros nuevos en Scala que no es justo que sea correcto asociativo. También es que ConsWrapper implementa '# ::' como [call-by-name] (https://github.com/scala/scala/blob/v2.10.3/src/library/scala/collection/immutable/Stream. scala # L1042). es decir, el '⇒' en' ConsWrapper (tl: ⇒ Stream [A]) 'de modo que la traducción a' inmutable.this.Stream.consWrapper (fibFrom (b, a + b)). #: :(a) 'significa 'fibFrom (b, a + b)' solo se llamará cuando se acceda. – nicerobot