2009-07-11 12 views
49

Nella programmazione orientata agli oggetti, si potrebbe dire i concetti fondamentali sono:Quali sono i concetti chiave nella programmazione funzionale?

  1. incapsulamento
  2. eredità,
  3. polimorfismo

E sarebbe nella programmazione funzionale?

+12

Perché credi che quelli sono i concetti fondamentali della programmazione orientata agli oggetti? Molti linguaggi OO non hanno incapsulamento (ad esempio Python, CLOS). Alcuni linguaggi OO non hanno ereditarietà (ad esempio Self, JavaScript e qualsiasi altro linguaggio basato su prototipi), altri lo fanno ma non è un grosso problema (praticamente qualsiasi linguaggio dinamico o qualsiasi altra lingua con digitazione anatra). L'unica cosa che è veramente comune a tutti è il polimorfismo runtime. –

+2

Da wikipedia: "Armstrong, The Quarks of Object-Oriented Development.In ordine decrescente di popolarità, i "quark" sono: Eredità, Oggetto, Classe, Incapsulamento, Metodo, Passaggio di Messaggio, Polimorfismo, Astrazione " – Nosredna

+0

Nosredna, e nessuno di essi ha un significato preciso – Apocalisp

risposta

56

Non c'è consenso della comunità su quali sono i concetti essenziali nella programmazione funzionale. In Why Functional Programming Matters (PDF), John Hughes sostiene che si tratta di funzioni di ordine superiore e valutazione lenta. In Wearing the Hair Shirt: A Retrospective on Haskell, Simon Peyton Jones afferma che il vero essenziale non è la pigrizia, ma la purezza. Richard Bird sarebbe d'accordo. Ma c'è tutta una folla di programmatori Scheme e ML che sono perfettamente felici di scrivere programmi con effetti collaterali.

Come qualcuno che ha praticato e insegnato programmazione funzionale per venti anni, mi può dare alcune idee che sono ampiamente creduto di essere al centro della programmazione funzionale:

  • nidificati, di prima classe le funzioni con il corretto scope lessicale sono al centro. Ciò significa che è possibile creare una funzione anonima in fase di esecuzione, le cui variabili libere possono essere parametri o variabili locali di un che include la funzione e si ottiene un valore che è possibile restituire, inserire in strutture di dati e così via. (Questa è la forma più importante di funzioni di ordine superiore, ma alcune funzioni di ordine superiore (come qsort!) Può essere scritto in   C, che non è un linguaggio funzionale.)

  • Mezzi di comporre funzioni con altri funzioni per risolvere i problemi. Nessuno lo fa meglio di John Hughes.

  • Molti programmatori funzionali credono che la purezza (la libertà dagli effetti, incluse le mutazioni, I/O ed eccezioni) sia al centro della programmazione funzionale. Molti programmatori funzionali no.

  • Il polimorfismo, indipendentemente dal fatto che venga applicato dal compilatore o meno, è un valore fondamentale dei programmatori funzionali. Confusamente, i programmatori C++ chiamano questo concetto "programmazione generica". Quando il polimorfismo viene applicato dal compilatore, generalmente è una variante di Hindley-Milner, ma il più potente System F è anche una potente base per i linguaggi funzionali. E con linguaggi come Scheme, Erlang e Lua, puoi fare programmazione funzionale senza un sistema di tipo statico.

  • Infine, una grande maggioranza di programmatori funzionali crede nel valore di tipi di dati definiti in modo induttivo, a volte chiamati "tipi ricorsivi". Nelle lingue con sistemi di tipi statici questi sono generalmente noti come "tipi di dati algebrici", ma i tipi di dati definiti induttivamente si trovano anche in material written for beginning Scheme programmers. I tipi definiti in modo induttivo vengono in genere forniti con una funzionalità di linguaggio denominata corrispondenza di modello, che supporta una forma molto generale di analisi del caso. Spesso il compilatore può dirti se hai dimenticato un caso. Non vorrei programmare senza questa funzione linguistica (un lusso una volta campionato diventa una necessità).

+2

Penso che il polimorfismo sia fuorviante. La programmazione generica in C++ copre molto più di questo (in genere utilizza anche la metaprogrammazione per abilitare diverse implementazioni, a seconda del tipo: ciò di cui si parla è più simile ai generici .NET che ai modelli C++/programmazione generica).E questa forma di polimorfismo di tipo parametrico ha poco a che fare con ciò che i programmatori OOP chiamano polimorfismo. Se avessi chiamato i tipi polimorfici, sarebbe stato più chiaro, credo. – jalf

+0

@Norman Ramsey - Mi piace che tu abbia definito la purezza e devo ammettere che non avevo mai sentito dire che la programmazione funzionale incarna il polimorfismo. Sento che la mia risposta arriva alla carne della programmazione funzionale, ma ho trovato il tuo articolo informativo. Grazie. –

35

In informatica, la programmazione funzionale è un paradigma di programmazione che tratta il calcolo come la valutazione delle funzioni matematiche ed evita lo stato e i dati mutabili. Sottolinea l'applicazione delle funzioni, in contrasto con lo stile di programmazione imperativo, che enfatizza i cambiamenti di stato. La programmazione funzionale ha le sue radici nel calcolo lambda, un sistema formale sviluppato negli anni '30 per indagare sulla definizione della funzione, l'applicazione della funzione e la ricorsione. Molti linguaggi di programmazione funzionale possono essere visti come abbellimenti al calcolo lambda. - Wikipedia

In poche parole,

  1. Lambda Calcolo
  2. Superiore funzioni di ordine
  3. immutabilità
  4. effetti collaterali
+0

+1 per correttezza, -1 per l'utilizzo di una parola di 4 lettere come "paradigma". (ora devo lavare la tastiera ...) – Javier

+0

_paradigm_ è composto da due parole consecutive di 4 lettere. – Nosredna

+0

@Javier - La mia prossima domanda SO, "Quali prodotti usi per lavare la tastiera?" :) –

3

Astrazione, il processo di creazione di una funzione mediante la parametrizzazione su alcune parti di un'espressione.

Applicazione, il processo di valutazione di una funzione sostituendo i suoi parametri con valori specifici.

A un certo livello, questo è tutto quello che c'è da fare.

+0

Non proprio, c'è molto di più per FP di questo. –

14

Non direttamente una risposta alla tua domanda, ma vorrei sottolineare che la programmazione "orientata agli oggetti" e la programmazione funzionale non sono necessariamente in disaccordo. I "concetti chiave" che citi hanno controparti più generali che si applicano altrettanto bene alla programmazione funzionale.

L'incapsulamento, più in generale, è la modularizzazione. Tutti i linguaggi puramente funzionali che conosco supportano la programmazione modulare . Si potrebbe dire che queste lingue implementano l'incapsulamento meglio della tipica varietà "OO", dal momento che gli effetti collaterali rompono l'incapsulamento e le funzioni pure non hanno effetti collaterali.

L'ereditarietà, più in generale, è implicazione logica, che rappresenta ciò che rappresenta una funzione. La relazione canonica subclass -> superclass è una sorta di funzione implicita. Nei linguaggi funzionali, questo è espresso con classi di classi o implicite (ritengo implicito che sia il più generale di queste due).

Il polimorfismo nella scuola "OO" si ottiene mediante sottotipizzazione (ereditarietà). Esiste un tipo più generale di polimorfismo noto come polimorfismo parametrico (a.k.a.generici), che troverete supportati da linguaggi di programmazione puramente funzionali. Inoltre, alcuni supportano i "tipi superiori" o generici di ordine superiore (ad esempio il polimorfismo del costruttore del tipo ).

Quello che sto cercando di dire è che i "concetti chiave di OO" non sono specifici per OO in alcun modo. Io, per esempio, direi che non ci sono eventuali concetti di base di OO, in effetti,.

+0

In seguito, OO e Funzionale possono funzionare insieme. Alcuni linguaggi funzionali (CAML o OCAML per essere specifici) inseriscono concetti OO e alcuni linguaggi OO (come D e anche C#) usano concetti funzionali. Direi che "Oggetti" sono piuttosto fondamentali per l'idea della programmazione OO. ;) – CodexArcanum

+2

Quindi hai solo il problema di definire cosa sia esattamente un "oggetto" e come si differenzia da cose che non sono oggetti. In bocca al lupo. – Apocalisp

3

ripeto la risposta che ho dato ad una discussione nel gruppo programmazione funzionale Bangalore:

Un programma funzionale consiste solo di funzioni.Le funzioni calcolano i valori dai loro ingressi. Possiamo contrastarlo con la programmazione imperativa , dove, mentre il programma viene eseguito, i valori delle posizioni mutabili cambiano. In altre parole, in C o Java, una variabile denominata X si riferisce a una posizione il cui valore cambia. Ma nella programmazione funzionale X è il nome di un valore (non una posizione). Qualsiasi punto in cui sia lo scopo di X, ha lo stesso valore (vale a dire, è referenzialmente trasparente). In FP, le funzioni sono anche valori. Possono essere passati come argomenti ad altre funzioni. Questo è noto come programmazione funzionale funzionale di ordine superiore. Le funzioni di ordine superiore ci permettono di modellare una straordinaria varietà di modelli . Ad esempio, guarda la funzione mappa in Lisp. È che rappresenta un modello in cui il programmatore deve eseguire "qualcosa" su ogni elemento di un elenco. Quel 'qualcosa' è codificato come una funzione e passato come argomento da mappare.

Come abbiamo visto, la caratteristica più notevole di FP è il suo effetto immediato freeness. Se una funzione fa qualcosa di più del calcolo di un valore dal suo input, provoca un effetto collaterale. Tali funzioni sono non consentite in puro FP. È facile testare le funzioni senza effetti collaterali. Non esiste uno stato globale da configurare prima di eseguire il test e lo non è uno stato globale da verificare dopo aver eseguito il test. Ogni funzione può essere verificata in modo indipendente, , solo fornendo il suo input ed esaminando il valore di ritorno . Questo rende facile scrivere test automatici. Un altro vantaggio di di freeness per gli effetti collaterali è che ti dà un controllo migliore sul parallelismo .

Molti linguaggi FP trattano correttamente la ricorsione e l'iterazione. Lo fanno da supportando qualcosa chiamato coda-ricorsione. Quale coda-ricorsione è - se una funzione chiama se stessa, ed è l'ultima cosa che fa, lo rimuove immediatamente il frame dello stack corrente. In altre parole, se una funzione si chiama in coda in modo ricorsivo 1000 volte, non cresce lo stack a 1000 profondità. Ciò rende superflui i costrutti di loop speciali in queste lingue.

Lambda Calculus è la versione più ridotta di un linguaggio FP. I linguaggi FP di livello superiore come Haskell vengono compilati in Lambda Calcolo. Ha solo tre costrutti sintattici ma è ancora abbastanza espressivo da rappresentare qualsiasi astrazione o algoritmo.

La mia opinione è che FP dovrebbe essere vista come un meta-paradigma. Possiamo scrivere programmi in qualsiasi stile, incluso OOP, usando le semplici astrazioni funzionali fornite dal Lambda Calculus.

Grazie, - Vijay

originale collegamento discussione: http://groups.google.co.in/group/bangalore-fp/browse_thread/thread/4c2cfa7985d7eab3

Problemi correlati