Quiero una forma conveniente de generar un Iterable
, dado un objeto inicial y una función para producir el siguiente objeto de el actual, que consume O (1) memoria (es decir, no almacena en caché los resultados anteriores, si desea iterar por segunda vez, la función debe aplicarse nuevamente).Creando una O (1) -memoria Iterable de un objeto inicial y una función que genera el siguiente objeto, en Scala
Parece que no hay soporte de biblioteca para esto. En Scala 2.8, el método tiene la firma scala.collection.Iterable.iterate
def iterate [A] (start: A, len: Int)(f: (A) ⇒ A) : Iterable[A]
por lo que requiere que se especifique el número de aplicaciones de funciones iteradas que le interesa antes de tiempo, y mi comprensión de la documentación es que en realidad Iterable.iterate
calcula todos estos valores inmediatamente. Por otra parte, el método tiene la firma scala.collection.Iterator.iterate
def iterate [T] (start: T)(f: (T) ⇒ T) : Iterator[T]
la que se ve muy bien, pero sólo recibe un Iterator
que no ofrece todas las ventajas de map
, filter
y amigos.
¿Existe un método de biblioteca conveniente para producir lo que quiero?
y si no,
Puede alguien sugerir el código Scala 'coloquial' para hacer esto?
En resumen, dado un objeto inicial a: A
, y una función de f: A => A
, me gustaría un TraversableLike
(por ejemplo, probablemente un Iterable
) que genera a, f(a), f(f(a)), ...
, y utiliza O (1) de memoria, con map
, filter
etc. funciones que también devuelven algo que es O (1) en la memoria.
Una "pista": leyendo la API un poco más, estoy empezando a sospechar que una buena respuesta mencionará 'TraversableViewLike', pero también estoy cada vez más perplejo. –
Iterator * tiene * mapa, filtro y amigos ... ¿Estás seguro de que usan más que la memoria constante? – huynhjl
Es cierto, el mapa y el filtro están disponibles en 'Iterator', y no intentes nada tonto como forzar al' Iterator'. Pero un 'Iterable' sería más conveniente; ¿Por qué no debería esperar poder usar 'tail' (que, siempre que se llame a' iterator', debería eliminar el primer elemento mediante una llamada a 'next' antes de devolver' Iterator'), etc.? (De hecho, cuando traté de cambiar mi código de esperar 'Iterable's a' Iterator's, esto era algo que tenía que solucionar.) –