Quali sono i vantaggi della programmazione funzionale? [chiuso]


95

Quali pensi siano i vantaggi della programmazione funzionale? E come si applicano ai programmatori oggi?

Quali sono le maggiori differenze tra programmazione funzionale e OOP?


5
Il paradosso di Blub. paulgraham.com/avg.html
missingfaktor

Risposte:


75

Lo stile della programmazione funzionale è descrivere quello che vuoi, piuttosto che come ottenerlo. cioè: invece di creare un ciclo for con una variabile iteratore e marciare attraverso un array facendo qualcosa su ogni cella, diresti l'equivalente di "questa etichetta si riferisce a una versione di questo array in cui questa funzione è stata eseguita su tutti i elementi."

La programmazione funzionale sposta le idee di programmazione di base nel compilatore, idee come la comprensione delle liste e la memorizzazione nella cache.

Il più grande vantaggio della programmazione funzionale è la brevità, perché il codice può essere più conciso. Un programma funzionale non crea una variabile iteratore che sia il centro di un ciclo, quindi questo e altri tipi di sovraccarico vengono eliminati dal codice.

L'altro vantaggio principale è la concorrenza, che è più facile da fare con la programmazione funzionale perché il compilatore si prende cura della maggior parte delle operazioni che richiedevano l'impostazione manuale delle variabili di stato (come l'iteratore in un ciclo).

Alcuni vantaggi in termini di prestazioni possono essere visti anche nel contesto di un singolo processore, a seconda del modo in cui il programma è scritto, poiché la maggior parte dei linguaggi e delle estensioni funzionali supportano la valutazione pigra. In Haskell puoi dire "questa etichetta rappresenta un array contenente tutti i numeri pari". Un array di questo tipo è infinitamente grande, ma puoi richiedere il centomillesimo elemento di quell'array in qualsiasi momento senza dover sapere, al momento dell'inizializzazione dell'array, di quale valore più grande avrai bisogno. Il valore verrà calcolato solo quando ne avrai bisogno e non oltre.


12
Penso che il tuo primo paragrafo sia più vicino alla descrizione della programmazione relazionale dichiarativa come Prolog che alla programmazione funzionale.
McPherrinM

6
@McPherrinM: i linguaggi funzionali sono dichiarativi, anziché imperativi.
Lie Ryan

2
Sembra che tu stia confondendo DP contro IP, con procedurale contro FP . FP fornisce la separazione delle preoccupazioni enfatizzando la composizione delle funzioni, cioè separando le dipendenze tra i sottocomputer di un calcolo deterministico.
Shelby Moore III

2
@LieRyan non corretto. Si prega di vedere il collegamento nel mio commento precedente
Shelby Moore III

La concorrenza sta avendo più thread che possono interagire tra loro, il che è imperativo. L'esecuzione di più calcoli indipendenti contemporaneamente è chiamata parallelismo . Vedi en.wikipedia.org/wiki/Concurrency_(computer_science)
Lambda Fairy

29

Il vantaggio più grande è che non è quello a cui sei abituato. Scegli una lingua come Scheme e impara a risolvere i problemi con essa, e diventerai un programmatore migliore nelle lingue che già conosci. È come imparare una seconda lingua umana. Presumi che gli altri siano fondamentalmente una variazione da solo perché non hai nulla con cui confrontarli. L'esposizione agli altri, a persone particolari che non sono legate a ciò che già sai, è istruttiva.


28
questo è un vantaggio di impararlo, non un vantaggio del paradigma stesso
Moe

2
Ma sono davvero separati? Dal punto di vista dell'interrogante originale, direi di no: è molto probabile che stiano cercando benefici in totale nello spendere lo sforzo per imparare un linguaggio funzionale.
Kendall Helmstetter Gelner

3
"è un vantaggio nell'apprenderlo, non un vantaggio del paradigma stesso". Il paradigma trapelerà nel tuo altro lavoro OOP e può aiutarti a semplificare il tuo sviluppo lì. Puoi affrontare i problemi da "calcola questo output da questo input" e "componi queste due funzioni che calcolano nuovi dati" invece di "aspetta --- qual era lo stato di qualche variabile condivisa laggiù?" e "ho eseguito queste procedure nell'ordine corretto?". Seriamente, ottieni questi vantaggi (dalla comprensione del paradigma FP) in Python, C #, C ++, Java, lo chiami.
Jared Updike

11

Perché la programmazione funzionale è importante
http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf

Astratto

Man mano che il software diventa sempre più complesso, è sempre più importante strutturarlo bene. Un software ben strutturato è facile da scrivere ed eseguire il debug e fornisce una raccolta di moduli che possono essere riutilizzati per ridurre i costi di programmazione futuri.

In questo articolo mostriamo che due caratteristiche dei linguaggi funzionali in particolare, le funzioni di ordine superiore e la valutazione pigra, possono contribuire in modo significativo alla modularità. A titolo di esempio, manipoliamo elenchi e alberi, programmiamo diversi algoritmi numerici e implementiamo l'euristica alfa-beta (un algoritmo dell'intelligenza artificiale utilizzato nei programmi di gioco). Concludiamo che poiché la modularità è la chiave per una programmazione di successo, la programmazione funzionale offre importanti vantaggi per lo sviluppo del software.


10

Un buon punto di partenza quindi sarebbe cercare di capire alcune cose che non sono possibili nei linguaggi imperativi ma possibili nei linguaggi funzionali.

Se stai parlando di computabilità, ovviamente non c'è nulla che sia possibile nella programmazione funzionale ma non imperativa (o viceversa).

Lo scopo dei diversi paradigmi di programmazione non è di rendere possibili cose che prima non erano possibili, ma di rendere le cose facili che prima erano difficili.

La programmazione funzionale mira a consentire di scrivere più facilmente programmi concisi, privi di bug e parallelizzabili.


5

Non deve essere l'uno o l'altro: l'uso di un linguaggio come C # 3.0 ti consente di mescolare i migliori elementi di ciascuno. OO può essere utilizzato per la struttura su larga scala a livello di classe e superiore, lo stile funzionale per la struttura su piccola scala a livello di metodo.

L'uso dello stile funzionale consente di scrivere codice che dichiara chiaramente il suo intento, senza essere confuso con istruzioni del flusso di controllo, ecc. A causa dei principi come la programmazione senza effetti collaterali, è molto più facile ragionare sul codice e verificarne la correttezza .


5

Penso che l'esempio più pratico della necessità di programmazione funzionale sia la concorrenza: i programmi funzionali sono naturalmente thread-safe e dato l'ascesa dell'hardware multi core questo è della massima importanza.

La programmazione funzionale aumenta anche la modularità - puoi spesso vedere metodi / funzioni in imperativo che sono troppo lunghi - non vedrai quasi mai una funzione lunga più di un paio di righe. E poiché tutto è disaccoppiato, la riutilizzabilità è molto migliorata e il test delle unità è molto molto semplice.


3

Una volta che il programma cresce, il numero di comandi nel nostro vocabolario diventa troppo alto, rendendolo molto difficile da usare. È qui che la programmazione orientata agli oggetti ci semplifica la vita, perché ci permette di organizzare i nostri comandi in un modo migliore. Possiamo associare tutti i comandi che coinvolgono il cliente con qualche entità cliente (una classe), il che rende la descrizione molto più chiara. Tuttavia, il programma è ancora una sequenza di comandi che specifica come dovrebbe procedere.

La programmazione funzionale offre un modo completamente diverso di estendere il vocabolario. Non limitato all'aggiunta di nuovi comandi primitivi; possiamo anche aggiungere nuove strutture di controllo: primitive che specificano come possiamo mettere insieme i comandi per creare un programma. Nei linguaggi imperativi, siamo stati in grado di comporre comandi in una sequenza o utilizzando un numero limitato di costrutti incorporati come i cicli, ma se guardi i programmi tipici, vedrai ancora molte strutture ricorrenti; modi comuni di combinare i comandi


1

Non pensare alla programmazione funzionale in termini di "necessità". Invece, pensala come un'altra tecnica di programmazione che ti aprirà la mente proprio come OOP, modelli, linguaggio assembly, ecc. Potrebbero aver completamente cambiato il tuo modo di pensare quando (se) li hai imparati. In definitiva, l'apprendimento della programmazione funzionale ti renderà un programmatore migliore.


0

Se non conosci già la programmazione funzionale, impararla ti offre più modi per risolvere i problemi.

FP è una semplice generalizzazione che promuove le funzioni a valori di prima classe mentre OOP è per la strutturazione su larga scala del codice. Tuttavia, esiste una certa sovrapposizione in cui i modelli di progettazione OOP possono essere rappresentati direttamente e in modo molto più sintetico utilizzando funzioni di prima classe.

Molti linguaggi forniscono sia FP che OOP, inclusi OCaml, C # 3.0 e F #.

Saluti, Jon Harrop.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.