Je souhaite un moyen pratique de générer un objet Iterable
, en lui affectant un objet initial et une fonction pour produire l'objet suivant celui qui consomme la mémoire O (1) (c.-à-d., il ne cache pas les anciens résultats, si vous voulez répéter une seconde fois, la fonction doit être appliquée à nouveau).Création d'une mémoire O (1) Iterable à partir d'un objet initial et d'une fonction générant l'objet suivant, en Scala
Il semble qu'il n'y ait pas de support de bibliothèque pour cela. Dans Scala 2.8, la méthode scala.collection.Iterable.iterate
a la signature
def iterate [A] (start: A, len: Int)(f: (A) ⇒ A) : Iterable[A]
donc il faut que vous spécifiez le nombre d'applications de fonctions itérées vous êtes intéressé à l'avance, et ma compréhension de la documentation est que Iterable.iterate
calcule en fait toutes ces valeurs immédiatement. D'autre part, la méthode scala.collection.Iterator.iterate
a la signature
def iterate [T] (start: T)(f: (T) ⇒ T) : Iterator[T]
qui ressemble beaucoup, mais nous obtenons seulement une Iterator
qui n'offre tout le confort de map
, filter
et amis.
Existe-t-il une méthode de bibliothèque pratique pour produire ce que je veux?
et sinon,
Quelqu'un peut-il suggérer le 'dialectal' le code Scala pour ce faire?
En résumé, étant donné un objet initial a: A
, et une fonction f: A => A
, je voudrais un TraversableLike
(par exemple, probablement un Iterable
) qui génère a, f(a), f(f(a)), ...
, et utilise la mémoire de O (1), avec map
, filter
etc fonctions qui retournent aussi quelque chose qui est O (1) en mémoire.
Un "indice": en lisant l'API un peu plus, je commence à soupçonner qu'une bonne réponse mentionnera "TraversableViewLike", mais je suis aussi de plus en plus perplexe. –
Iterator * a * map, filtre et amis ... Es-tu certain qu'ils utilisent plus que de la mémoire constante? – huynhjl
C'est vrai, map et filter et ainsi de suite sont disponibles sur 'Iterator', et n'essayez rien de stupide comme forcer le' Iterator'. Mais un Iterable serait plus commode; pourquoi ne devrais-je pas espérer pouvoir utiliser 'queue' (qui, quand' iterator' est appelé), devrait supprimer le premier élément via un appel à 'next' avant de rendre le' Iterator', etc? (En fait, quand j'ai essayé de passer mon code d'attendre Iterable à Iterator, c'était quelque chose que je devais contourner.) –