Voglio un modo conveniente per generare un Iterable
, dato un oggetto iniziale e una funzione per produrre l'oggetto successivo da quello corrente, che consuma memoria O (1) (cioè non memorizza i vecchi risultati, se si desidera ripetere una seconda volta, la funzione deve essere nuovamente applicata).Creazione di un memoriale O (1) Iterable da un oggetto iniziale e una funzione che genera l'oggetto successivo, in Scala
Non sembra che ci sia il supporto di libreria per questo. In Scala 2.8, il metodo scala.collection.Iterable.iterate
ha la firma
def iterate [A] (start: A, len: Int)(f: (A) ⇒ A) : Iterable[A]
quindi richiede di specificare quante applicazioni algoritmo iterativo che ti interessa prima del tempo, e la mia comprensione della documentazione è che Iterable.iterate
calcola in realtà tutti questi valori subito. D'altra parte, il metodo scala.collection.Iterator.iterate
ha la firma
def iterate [T] (start: T)(f: (T) ⇒ T) : Iterator[T]
che sembra grande, ma abbiamo solo ottenere un Iterator
che non offre tutte le comodità di map
, filter
e gli amici.
Esiste un metodo biblioteca conveniente produrre quello che voglio?
e se non,
Qualcuno può suggerire il codice 'colloquiale' Scala per fare questo?
In sintesi, in un oggetto iniziale a: A
, e una funzione f: A => A
, Vorrei una TraversableLike
(ad esempio, probabilmente un Iterable
) che genera a, f(a), f(f(a)), ...
, e utilizza O (1) di memoria, con map
, filter
ecc. funzioni che restituiscono anche qualcosa che è O (1) in memoria.
Un "indizio": leggendo l'API un po 'di più, sto iniziando a sospettare che una buona risposta menzionerà 'TraversableViewLike', ma sono anche sempre più perplessa. –
Iterator * ha * mappa, filtro e amici ... Sei sicuro che usano più di una memoria costante? – huynhjl
È vero, map e filter e così via sono disponibili su 'Iterator', e non provare nulla di strano come forzare' Iterator'. Ma un "Iterable" sarebbe più conveniente; perché non dovrei aspettarmi di poter usare 'tail' (che, ogni volta che viene chiamato' iterator', dovrebbe rimuovere il primo elemento tramite una chiamata a 'next' prima di restituire' Iterator'), etc? (In effetti, quando ho provato a passare il mio codice da "Iterable's a' Iterator's, era qualcosa che dovevo risolvere.) –