Sto cercando un modo per interrompere una funzione di livello superiore dopo aver valutato parte della sua sequenza di input.È possibile interrompere una valutazione breve di una funzione di livello superiore?
Considerare una situazione quando si cerca il primo indice in una sequenza che soddisfa una determinata condizione. Ad esempio, supponiamo che stiamo cercando la prima posizione in una matrice a
di Int
s dove la somma dei due valori consecutivi è superiore a 100.
Si può fare con un ciclo, come questo:
func firstAbove100(a:[Int]) -> Int? {
if a.count < 2 {
return nil
}
for i in 0..<a.count-1 {
if a[i]+a[i+1] > 100 {
return i
}
}
return nil
}
Il ciclo si interrompe non appena viene scoperta la posizione di interesse.
possiamo riscrivere questo codice usando reduce
come segue:
func firstAbove100(a:[Int]) -> Int? {
if a.count < 2 {
return nil
}
return (0..<a.count-1).reduce(nil) { prev, i in
prev ?? (a[i]+a[i+1] > 100 ? i : nil)
}
}
Tuttavia, lo svantaggio di questo approccio è che reduce
va tutta la strada fino a a.count-2
anche se si trova una corrispondenza al primo indice. Il risultato sarà lo stesso, ma sarebbe bello tagliare il lavoro non necessario.
C'è un modo per impedire a reduce
di provare ulteriori corrispondenze o forse una funzione diversa che consente di fermarsi dopo aver trovato la prima corrispondenza?
@paulvs Perché è copia-incasinato andato male :-) Grazie! – dasblinkenlight
Non penso che ci sia un modo integrato per farlo con 'reduce'. L'intero punto di 'reduce' è che combina e valuta la * intera * sequenza. Per questo specifico caso d'uso, probabilmente dovresti scrivere la tua funzione, come hai fatto nel tuo primo blocco di codice. –
'reduce' è solo un' forEach' che sta passando un valore alla successiva iterazione. Se si desidera cortocircuitare, è necessario utilizzare una funzione di ordine elevato che la supporta. O scrivi la tua versione di 'reduce'. In questo caso penso che l'uso di 'reduce' sia una scelta molto brutta in quanto non si sta effettivamente utilizzando l'accumulatore. – Sulthan