En 2.8, hay un método protegido llamado tailDefined
que devolverá falso cuando llegue al punto en la secuencia que aún no se ha evaluado.
Esto no es demasiado útil (a menos que desee escribir su propia clase Stream
), excepto que Cons
hace que el método sea público. No estoy seguro de por qué está protegido en Stream y no en Cons. Creo que uno o el otro podría ser un error. Pero por ahora, al menos, se puede escribir un método como tal (escribir un equivalente funcional se deja como ejercicio para el lector):
def streamEvalLen[T](s: Stream[T]) = {
if (s.isEmpty) 0
else {
var i = 1
var t = s
while (t match {
case c: Stream.Cons[_] => c.tailDefined
case _ => false
}) {
i += 1
t = t.tail
}
i
}
}
Aquí puede verlo en acción:
scala> val s = Stream.iterate(0)(_+1)
s: scala.collection.immutable.Stream[Int] = Stream(0, ?)
scala> streamEvalLen(s)
res0: Int = 1
scala> s.take(3).toList
res1: List[Int] = List(0, 1, 2)
scala> s
res2: scala.collection.immutable.Stream[Int] = Stream(0, 1, 2, ?)
scala> streamEvalLen(s)
res3: Int = 3
El método 'tailDefined' es público en ambos' Contras' y 'Empty', así que no creo que sea un error. No me di cuenta de eso antes. Puedo adaptar tu solución para resolver mi problema. –