Ich möchte einen Iterable
mit einem Anfangsobjekt und einer Funktion zum Erzeugen des nächsten Objekts erstellen das aktuelle, das O (1) Speicher verbraucht (dh es speichert keine alten Ergebnisse; wenn Sie es ein zweites Mal wiederholen wollen, muss die Funktion erneut angewendet werden).Erstellen eines O (1) -memory Iterable von einem Anfangsobjekt und einer Funktion, die das nächste Objekt erzeugt, in Scala
Es scheint nicht, dass es Bibliotheksunterstützung dafür gibt. In Scala 2.8 hat das Verfahren scala.collection.Iterable.iterate
Signatur
def iterate [A] (start: A, len: Int)(f: (A) ⇒ A) : Iterable[A]
so erfordert es, dass Sie angeben, wie viele iterierte Funktionsanwendungen Sie in vor der Zeit interessiert sind, und mein Verständnis der Dokumentation ist, dass Iterable.iterate
alle tatsächlich berechnet diese Werte sofort. Auf der anderen Seite hat das Verfahren scala.collection.Iterator.iterate
Unterschrift
def iterate [T] (start: T)(f: (T) ⇒ T) : Iterator[T]
, die sieht gut aus, aber wir haben nur ein Iterator
bekommen, die nicht den Komfort von map
, filter
und Freunden bietet.
Gibt es eine bequeme Bibliotheksmethode, um zu produzieren, was ich will?
und wenn nicht,
Kann jemand den 'umgang' Scala Code vorschlagen, dies zu tun?
Zusammenfassend wird ein Anfangsobjekt a: A
gegeben, und eine Funktion f: A => A
, würde Ich mag eine TraversableLike
(zB wahrscheinlich eine Iterable
), die a, f(a), f(f(a)), ...
erzeugt und verwendet O (1) Speicher, mit map
, filter
usw. Funktionen, die auch etwas zurückgeben, das O (1) im Speicher ist.
A „Hinweis“: die API einig mehr lesen, ich fange an zu vermuten, dass eine gute Antwort erwähnt 'TraversableViewLike', aber ich bin auch zunehmend ratlos. –
Iterator * hat * Karte, Filter und Freunde ... Sind Sie sicher, dass sie mehr als konstanten Speicher verwenden? – huynhjl
Es ist wahr, Karte und Filter und so weiter sind auf 'Iterator' verfügbar, und versuchen Sie nichts Albernes wie den' Iterator' zu erzwingen. Aber ein 'Iterable' wäre bequemer; Warum sollte ich nicht erwarten, in der Lage zu sein, 'tail' zu benutzen (was, wann immer' iterator' aufgerufen wird, sollte das erste Element durch einen Aufruf von 'next' entfernen, bevor der' Iterator' zurückgegeben wird), etc? (In der Tat, als ich versuchte, meinen Code zu wechseln von erwarten 'Iterable's zu' Iterator's, das war etwas, was ich um arbeiten musste.) –