Sono nuovo alla programmazione funzionale, quindi alcuni problemi sembrano più difficili da risolvere utilizzando un approccio funzionale.Informazioni sui calcoli precedenti
Diciamo che ho una lista di numeri, come 1 a 10.000, e voglio ottenere gli elementi della lista che riassume al massimo un numero n (diciamo 100). Quindi, otterrebbe i numeri fino a quando la loro somma è maggiore di 100.
Nella programmazione imperativa, è banale risolvere questo problema, perché posso mantenere una variabile in ogni interazione e fermarsi una volta raggiunto l'obiettivo.
Ma come posso fare lo stesso nella programmazione funzionale? Dato che la funzione somma funziona su liste completate, e io ancora non ho la lista completa, come posso 'portare avanti' il calcolo?
Se somma è stata calcolata pigramente, potrei scrivere qualcosa di simile:
(1 to 10000).sum.takeWhile(_ < 100)
PS: Anche se una risposta sarà apprezzato, vorrei uno che non calcola la somma di volta in volta, dal momento che ovviamente la versione imperativa sarà molto più ottimale per quanto riguarda la velocità.
Edit:
So che posso "convertire" l'approccio ad anello indispensabile per una funzione ricorsiva funzionale. Sono più interessato a scoprire se una delle funzioni di libreria esistenti può fornire un modo per non scriverne una ogni volta che ho bisogno di qualcosa.
Probabilmente è più semplice utilizzare un accumulatore variabile. '{var sum = 0; (Da 1 a 10000) takeWhile {i => sum + = i; sum <100}} '. Niente di male nell'avere un 'var' qui; non può sfuggire perché l'espressione ha '{}' attorno ad esso. –
Perché pensi che scrivere una funzione "ogni volta che hai bisogno di qualcosa" sia meno naturale di scrivere un ciclo imperativo ogni volta che hai bisogno di qualcosa? – Ben