Caratteristiche di programmazione funzionale, esempi, vantaggi, svantaggi

3066
Simon Doyle
Caratteristiche di programmazione funzionale, esempi, vantaggi, svantaggi

Il programmazione funzionale corrisponde al modello di programmazione che si basa sul concetto di dichiarare la procedura di un programma come un modello funzionale matematico piuttosto che come sequenze esplicite di istruzioni a un processore, che è il concetto principale nella programmazione imperativa.

Il linguaggio funzionale enfatizza affermazioni e termini piuttosto che eseguirli. In questa programmazione, il risultato dipenderà solo dai parametri che vengono passati a una funzione, a differenza di altri tipi che obbediscono a uno stato locale o globale.

Diagramma di come opera la funzione di mappatura nel linguaggio di programmazione funzionale Haskell. Fonte: di Pluke - Opera propria, CC0 commons.wikimedia.org.

Il suo nome deriva dalle funzioni matematiche, che sono l'assegnazione di un insieme di input a un insieme di output. Una funzione matematica in realtà non svolge alcun lavoro, ma descrive il modello di un processo, spiegando per mezzo di una formula cosa produce un insieme di input in una funzione.

Indice articolo

  • 1 Idee di base
  • 2 caratteristiche
    • 2.1 Funzioni pure
    • 2.2 Funzionalità di prima classe
    • 2.3 Trasparenza referenziale
    • 2.4 Ricorsione
    • 2.5 Immutabilità
  • 3 esempi
    • 3.1 Approcci imperativi e dichiarativi
    • 3.2 Funzioni pure
    • 3.3 Funziona come oggetti di prima classe
  • 4 vantaggi
    • 4.1 Più breve e più facile da capire
    • 4.2 Nessun flusso di controllo
  • 5 Svantaggi
  • 6 Applicazioni
    • 6.1 Metodologia funzionale
    • 6.2 Linguaggi che supportano la programmazione funzionale
  • 7 Riferimenti

Idee di base

La base su cui si basava la programmazione funzionale era il lambda calcolo, sviluppato durante il terzo decennio del XX secolo per definire e applicare le funzioni. LISP è stato il primo linguaggio di programmazione del suo genere, progettato nel 1960.

Sebbene la maggior parte dei linguaggi di programmazione sia costituita da input, output e variabili esterne che possono essere impostate o utilizzate dall'interno delle funzioni, la programmazione funzionale lo evita. L'idea è che ogni volta che una funzione viene chiamata con gli stessi parametri, dovrebbe restituire lo stesso valore.

Caratteristiche

I linguaggi di programmazione funzionale sono chiamati applicazioni, perché le funzioni sono applicate ai loro parametri, oltre che dichiarative e non procedurali, poiché le definizioni specificano cosa deve essere calcolato e non come viene calcolato.

Funzioni pure

Una funzione è pura quando non ha effetti collaterali osservabili, come alterazione di variabili esterne, cambiamenti nel filesystem, ecc..

Queste funzioni sono considerate convincenti, poiché non modificheranno espressamente alcuna variabile da cui altre parti del codice potrebbero dipendere ad un certo punto. Sembrerebbe scomodo programmare con queste restrizioni, ma queste funzioni dovrebbero essere considerate deterministiche, prevedibili e componibili..

Funzionalità di prima classe

Le funzioni sono considerate come valori che possono essere assegnati alle variabili, quindi possono essere passate e restituite da altre funzioni. Cioè, una funzione può essere utilizzata come se fosse un parametro o come un valore che viene restituito.

Ciò implica che la funzione può essere passata come tale, piuttosto che solo il risultato della funzione. Ad esempio, si consideri la funzione double (x), che restituisce il doppio del valore del suo parametro di input. Pertanto, double (2) restituirà 4.

Trattandosi di una funzione di prima classe, il codice (double (double (2)) sarebbe lo stesso del codice double (4). Ciò consente di annidare una funzione come parametro di un'altra e così via.

Trasparenza referenziale

Si riferisce al fatto che in questo modello di programmazione non ci sono istruzioni di assegnazione. Ovvero, è necessario definire nuove variabili se si desidera memorizzare valori aggiuntivi. Pertanto, lo stato di una variabile è sempre costante.

Ciò elimina la minima possibilità di effetti indesiderati, poiché qualsiasi variabile può essere sostituita dal suo valore reale durante qualsiasi punto di esecuzione del programma..

Ricorsione

Nella programmazione funzionale non ci sono cicli "for" e "while". Invece, l'iterazione si basa sulla ricorsione. La ricorsione viene implementata utilizzando funzioni ricorsive, che chiamano se stesse ripetutamente fino a quando non viene raggiunto il caso base.

Immutabilità

Le variabili sono immutabili, ovvero non è possibile modificare una variabile una volta che è stata inizializzata. Sebbene sia possibile creare una nuova variabile, la modifica delle variabili esistenti non è consentita.

Esempi

Approcci imperativi e dichiarativi

Con un esempio è possibile analizzare la differenza tra questi approcci, eseguendo la stessa operazione in entrambi gli arrangiamenti, ovvero filtrare i numeri dispari da una lista sostituendo 5 con numeri pari inferiori a 5.

È lo stesso calcolo, con lo stesso risultato. Tuttavia, come puoi vedere, il codice imperativo è dettagliato e non immediatamente chiaro. D'altra parte, l'approccio dichiarativo è leggibile ed esplicito, perché si concentra su ciò che si desidera ottenere.

Funzioni pure

Ciò che viene definito come funzioni pure e impure può essere chiarito con alcuni esempi di base:

Funziona come oggetti di prima classe

Significa usare le funzioni nello stesso modo in cui vengono usati i dati. Pertanto, possono essere passati come parametri a un'altra funzione. Nell'esempio seguente, la funzione int può essere passata come parametro alla funzione map:

>>> elenco (map (int, ["1", "2", "3"]))

[1, 2, 3]

Possono essere assegnati a variabili e restituiti. Ad esempio, nel codice seguente puoi assegnare la funzione hello_world, quindi eseguire la variabile come funzione.

Vantaggio

- Concentrati su ciò che vuoi ottenere (dichiarativo) e non su come ottenerlo (imperativo).

- Non contengono istruzioni di assegnazione, quindi dopo che alle variabili è stato assegnato un valore, non cambieranno più. Pertanto, i programmi funzionali non contengono effetti collaterali.

- Il flusso logico è chiaro, poiché lo stato è meno disperso e non viene modificato implicitamente.

- Supporta il concetto di valutazione pigra, il che significa che il valore viene valutato e archiviato solo quando necessario.

- Poiché le funzioni pure non cambiano alcuno stato e dipendono completamente dall'input, sono facili da capire. Il valore di ritorno fornito da tali funzioni è lo stesso del risultato prodotto da esse.

- A causa della natura delle funzioni pure per evitare che le variabili o qualsiasi dato esterno cambino, l'implementazione della concorrenza è efficace.

- Le funzioni vengono trattate come valori, passate ad altre funzioni come parametri. Ciò migliora la comprensione e la leggibilità del codice..

- Le funzioni pure accettano i parametri una volta, producendo un output immutabile. L'utilizzo di valori inalterabili semplifica il debug e il test.

Più breve e più facile da capire

Sono più brevi e più facili da capire degli imperativi. Gli studi hanno dimostrato che la produttività media del programmatore in termini di righe di codice è più o meno la stessa per qualsiasi linguaggio di programmazione, traducendosi in una maggiore produttività.

Nessun flusso di controllo

La chiamata di una funzione non può avere un effetto diverso dal calcolo del suo risultato. Ciò esclude un'importante fonte di errori, rendendo irrilevante anche l'ordine di esecuzione, poiché nessun effetto secondario potrà modificare il valore di un'espressione, e potrà essere valutato in qualsiasi momento.

Il programmatore è sollevato dall'onere di stabilire un flusso di controllo. Poiché le espressioni possono essere valutate in qualsiasi momento, le variabili possono essere sostituite dai loro valori.

Questa autonomia favorisce che i programmi funzionali siano più gestibili dal punto di vista matematico rispetto ai programmi convenzionali..

Svantaggi

- Il paradigma di programmazione funzionale non è semplice, rendendo difficile la comprensione per un principiante.

- È difficile da mantenere, poiché molti oggetti si evolvono durante la codifica.

- In alcuni casi, la scrittura di funzioni pure provoca una riduzione della leggibilità del codice.

- I valori immutabili in combinazione con la ricorsione possono portare a una drastica riduzione delle prestazioni del sistema.

- Il riutilizzo è molto complicato e richiede un refactoring costante.

- Scrivere programmi in uno stile ricorsivo invece di utilizzare cicli o cicli può essere un compito molto arduo..

- Gli oggetti potrebbero non rappresentare correttamente il problema.

- Sebbene scrivere funzioni pure risulti facile, combinarle con il resto dell'applicazione e con le operazioni di input / output è abbastanza difficile

Applicazioni

La programmazione dell'intelligenza artificiale viene eseguita in linguaggi di programmazione funzionale e le tecniche di intelligenza artificiale migrano verso applicazioni del mondo reale.

Eccelle anche nell'implementazione di modelli matematici complessi. Per questo motivo, uno degli usi principali dei linguaggi funzionali è stato tradizionalmente accademico. È utile per sviluppare specifiche eseguibili e implementazioni di prototipi.

Molti linguaggi funzionali eccellono anche nell'implementazione dell'elaborazione parallela. Ciò è dovuto alla sua capacità di sfruttare le funzioni pure, che restituiscono sempre lo stesso valore indipendentemente dall'ordine in cui vengono eseguite..

Metodologia funzionale

WhatsApp utilizza il linguaggio di programmazione Erlang, che segue il modello di programmazione funzionale, consentendo così a più di cento dei suoi dipendenti di gestire i dati appartenenti a circa 1,6 miliardi di persone.

Un altro importante vettore dello stile di programmazione funzionale è Haskell. Viene utilizzato da Facebook nel suo sistema antispam. Anche JavaScript, uno dei linguaggi di programmazione più utilizzati, ostenta le proprietà di un linguaggio funzionale di tipo dinamico.

Linguaggi che supportano la programmazione funzionale

D

È stato progettato dopo C ++, ottenendo tutti i suoi vantaggi eliminando i suoi punti deboli osservati di dover essere compatibile con C.

Erlang

È altamente scalabile e simultaneo, rendendolo ideale per le telecomunicazioni e altre applicazioni che ricevono enormi quantità di dati in un ordine imprevedibile..

Haskell

Questo è un linguaggio di programmazione funzionale puro, che utilizza il calcolo Lambda.

ML

È utilizzato in applicazioni matematiche, scientifiche, finanziarie, analitiche e di altro tipo. Uno dei suoi punti di forza è creare software per gestire altri programmi.

Obiettivo Caml

È un linguaggio open source basato su Caml. Tende a creare programmi molto leggeri, aiutandoli a caricarsi ed eseguire più velocemente di quelli creati da altri linguaggi.

schema

Si basa sulla sintassi LISP e sulla struttura ALGOL. Grazie alla sua semplicità, viene utilizzato in molti corsi di informatica come introduzione alla progettazione di programmi per mostrare alcuni dei fondamenti della programmazione informatica.

Riferimenti

  1. Chi lo ospita (2019). Impara la programmazione funzionale: questo stile di programmazione ti lascerà a bocca aperta. Tratto da: whoishostingthis.com.
  2. Andrea Bertoli (2019). Un'adeguata introduzione alla programmazione funzionale. Tratto da: dev.to.
  3. Hacker Earth (2020). Programmazione funzionale. Tratto da: hackerearth.com.
  4. Clojure (2020). Programmazione funzionale. Tratto da: clojure.org.
  5. Akhil Bhadwal (2020). Programmazione funzionale: concetti, vantaggi, svantaggi e applicazioni. Hack. Tratto da: hackr.io.
  6. Guru99 (2020). Cos'è la programmazione funzionale? Tutorial con esempio. Tratto da: guru99.com.

Nessun utente ha ancora commentato questo articolo.