I costrutti del ciclo diventano obsoleti? [chiuso]

4

Per costrutti ciclici intendo per ... e mentre ... costruisce con istruzioni annidate

Attualmente sto codificando uno strumento in Python e ho deciso, per curiosità, di non usare i loop regolari, e invece di fare affidamento su filtro / mappa / riduzione. Per esempio. ora ho il codice come:

fields = filter(None, map(parse_field, struct_decl.get_children()))

Finora funziona abbastanza bene e mi piace il modo in cui ora sto progettando il codice - Ho delle funzioni pulite (anche se a volte ho bisogno di usare un lambda) e penso che il codice risultante potrebbe essere più efficiente (ad esempio le iterazioni sono più naturalmente indipendenti rendendole più parallelizzabili). E devo solo aumentare il rientro per i condizionali (anche se sto pensando di evitarli)

Queste nuove funzioni non sono esclusive di Python - ad es. C ++ aveva std :: foreach per anni.

Mi chiedo se i loop tradizionali finiranno per disapprovare nelle lingue tradizionali, in modo simile a goto ?

    
posta Eugene 06.12.2013 - 22:35
fonte

1 risposta

4

Direi che la tua ipotesi è corretta. Le lingue mainstream acquisiscono funzionalità sempre più funzionali e, se si hanno costrutti come funzioni di ordine superiore e lambda / chiusure, le attività relative al "looping" diventano solo funzioni ordinarie.

Un buon esempio di questo sviluppo è Scala: ha while (usato principalmente per implementare le funzioni di libreria veloce), ma il suo for non è quello "tradizionale" in stile C, ma in realtà una comprensione per-simile a Haskell, che può filtrare, mappare e "flatMap". Inoltre, le classi di raccolta hanno un sacco di metodi come filter , map , foreach e roba più difficile come flatMap o diverse versioni di folding. Java 8 introdurrà alcune funzionalità simili per le raccolte (ma ovviamente non tanto quanto ha fatto Scala).

Anche se non è chiaro se i circuiti imperativi tradizionali scompariranno davvero, la loro importanza diminuirà considerevolmente. I vantaggi sono chiari:

  • Puoi pensare a un "livello superiore" in termini di collezioni e loro trasformazioni, non di qualcosa come le variabili del ciclo
  • Funzioni come foreach o map sono meno soggette a errori, poiché incapsulano il comportamento, impedendo ad es. errori una tantum completamente
  • Operazioni precedentemente scomode come il ciclo simultaneo anche se le raccolte diventano più facili ( zip , zipWith ), seguendo lo stesso stile funzionale
  • Le raccolte pigre (ad esempio i flussi), che sono potenzialmente strutture di dati infiniti, non funzionano troppo bene con i loop tradizionali; il paradigma della "trasformazione" è molto più naturale per loro di "looping"
  • Hai già menzionato la parallelizzazione
risposta data 07.12.2013 - 00:23
fonte

Leggi altre domande sui tag