Non riesco a capire perché ci sono due diverse strutture in Swift che sono quasi le stesse.SequenceOf e LazySequence: qual è la differenza e l'uso previsto?
- SequenceOf non è pigro?
- Quali sono gli usi previsti per ciascuno?
Edit: Penso di non capire ancora cosa sia "pigro" in sequenza significa ... F.e. prendere questo codice che utilizza SequenceOf che presumibilmente non è pigro:
func myMap<S: SequenceType, V>(source: S,
selector: S.Generator.Element -> V) -> SequenceOf<V> {
let seq = SequenceOf {
_ -> GeneratorOf<V> in
var gen = source.generate()
return GeneratorOf {
let v = gen.next()
println(v)
return v == nil ? nil : selector(v!)
}
}
return seq
}
chiamiamolo con
let a = myMap([1, 2, 3], { $0 * 2 })
var gen = a.generate()
let v1 = gen.next()
let v2 = gen.next()
Esso stampa
opzionale (1)
opzionale (2)
Mi sembra pigro per me ...
Edit # 2:
Quando si utilizza carta su una sequenza pigro sembra essere avidamente valutare gli elementi in ogni caso:
struct TransientView<S: SequenceType> : SequenceType {
private let seq: S
init(_ seq: S) {
self.seq = seq
}
func generate()
-> GeneratorOf<S.Generator.Element> {
var g = seq.generate()
return GeneratorOf {
println("next")
return g.next()
}
}
}
let seq = lazy(map(TransientView([1, 2, 3]), { $0 * 2 }))
stampe "prossimi" 4 volte ...
Modifica # 3. Ecco la mia opinione corrente: sarebbe sbagliato dire "SequenceOf non è pigro". È piuttosto "SequenceOf è esteso con non-pig .map, .filter, ecc". È del tutto possibile scrivere versioni lazy di map, filer, ecc che si applicherebbero a qualsiasi sequenza, incluso SequenceOf. Ma, Apple ha deciso di applicare il paradigma "pigro" non solo alle istanze di sequenze, ma anche agli elementi di sequenza, quindi se si dichiara la variabile di sequenza come pigra, viene utilizzato LazySequence e in quanto tali le estensioni sono pigre. Penso che questo sia un approccio sbagliato e la dichiarazione pigra non dovrebbe essere trasferita agli elementi - invece gli elementi dovrebbero essere tenuti pigri finché è possibile. È facile convertire i pigri in desiderosi, ma non è possibile diversamente.
Grazie, Velocità dell'Aria è la mia migliore amica ora! –
Puoi spiegare la pigrizia della sequenza? - ancora non capisco ... Aggiornamento della domanda. –
Quando si applica 'map' a una sequenza lenta, restituisce un nuovo generatore senza calcolare tutti i valori. Quando si applica 'map' a una sequenza non pigro, calcola immediatamente tutti i valori e restituisce una matrice. La mappa –