Domanda

Una delle caratteristiche principali della programmazione funzionale è l'uso di funzioni senza effetti collaterali. Tuttavia, questo può essere fatto anche in un linguaggio imperativo. Lo stesso vale per le funzioni di ricorsione e lambda (ad esempio C ++ 0x). Pertanto mi chiedo se i linguaggi di programmazione imperativa siano un superset di funzionali.

È stato utile?

Soluzione

In generale, no; La programmazione funzionale è un sottoinsieme di Programmazione dichiarativa (che include linguaggi di programmazione logica, come Prolog). Molte lingue imperative prendono in prestito elementi dai linguaggi di programmazione funzionale, ma semplicemente avere lambdas o funzioni referenziali trasparenti non rende funzionale un linguaggio imperativo; La programmazione funzionale non riguarda solo questi elementi.

Altri suggerimenti

Non posso davvero dire se sono sottoinsieme l'uno dell'altro. Quello che posso dire, tuttavia, che (tranne le lingue davvero esoteriche) sono tutti Turing-Complete, il che significa che alla fine sono tutti ugualmente potenti, ma non ugualmente espressivi.

Un paradigma è un modo per fare le cose e ci sono due principali paradigmi di programmazione: imperativo e dichiarativo. Il fatto che alcune lingue consentano di mescolare entrambi i paradigmi non significa che uno sia incluso nell'altro, ma che il le lingue sono multi-paradigma.

Per chiarire un po 'di più, lasciami continuare con la tua analogia: se Lisp e OCAML (per esempio) sono considerati linguaggi funzionali e entrambi consentono lo stile imperativo ... allora imperativo dovrebbe essere considerato un sottoinsieme di funzionale?

È possibile implementare un determinato paradigma di programmazione in un linguaggio che non supporta il paradigma di programmazione in modo nativo. Ad esempio è possibile scrivere un codice orientato agli oggetti in C mentre non è progettato per questo scopo.

La programmazione funzionale è un paradigma di programmazione ben sviluppato a sé stante ed è meglio appreso attraverso lingue come Haskell, Lisp ecc. E dopo averli appresi bene, anche se non usi questi linguaggi regolarmente, puoi iniziare a usare quei principi in Lingua quotidiana che usi su base regolare.

Ad alcune persone potrebbe piacere a Google per Programmazione orientata agli oggetti in C

La maggior parte delle lingue imperative non ha funzioni come tipi di primo ordine, mentre la maggior parte di Funzionald o. (Come C ++, tramite Boost :: Function.)

Per tipo di primo ordine, questa misura un valore/variabile può essere di qualsiasi tipo, un int, un bool, una funzione di int-> bool. Di solito include anche chiusure o valori limitati, in cui hai la stessa funzione, ma alcuni argomenti sono già compilati.

Quei due sono ciò di cui parla la programmazione funzionale, IMHO.

Penso che potrebbe essere utile trarre una distinzione tra paradigma e linguaggio.

Per me, paradigmi rappresentare "modi di pensare" (concetti e astrazioni come funzioni, oggetti, ricorsione), mentre le lingue offerta "modi di fare" (Sintassi, variabili, valutazioni).

Tutto vero I linguaggi di programmazione sono equivalenti Nel senso che lo sono Turing-Complete e in grado, in teoria, di calcolare qualsiasi funzione Turing-computabile e simulare o essere simulato da una macchina universale Turing.

La cosa interessante è quanto sia difficile svolgere determinati compiti in determinate lingue o paradigmi, quanto sia appropriato lo strumento per l'attività. Anche il gioco della vita di Conway è Turing-Complete, ma questo non mi fa venire voglia di programmare con esso.

Molte lingue supportano una serie di paradigmi. C ++ è stato progettato come estensione orientata agli oggetti per C, ma è possibile scrivere un codice puramente procedurale in esso.

Alcune lingue prendono in prestito/acquisiscono funzionalità da altre lingue o paradigmi nel tempo (basta guardare l'evoluzione di Java).

Alcune lingue, come il comune LISP, sono lingue in modo impressionante multi-paradigma. È possibile scrivere codice funzionale, orientato agli oggetti o procedurali in LISP. Probabilmente, l'orientamento all'aspetto fa già parte del comune sistema di oggetti LISP e quindi "niente di speciale". In LISP, è facile estendere il linguaggio stesso per fare tutto ciò che hai bisogno, quindi a volte viene chiamato "linguaggio di programmazione programmabile". (Sottolineerò qui che Lisp descrive una famiglia di lingue di cui LISP comune è solo un dialetto).

Penso che non importa quale dei termini, dichiarativo, imperativo, funzionale o procedurale, sia un sottoinsieme. Ciò che conta di più è capire le lingue degli strumenti con cui stai lavorando e come sono diverse dagli altri strumenti. Ancora più importante è comprendere i diversi modi di pensare che i paradigmi rappresentano, poiché quelli sono i tuoi tool di pensiero. Come con la maggior parte delle altre cose della vita, più capisci, più diventa efficace.

Un modo per guardarlo (non dire che è il modo giusto perché non sono un designer o un teorico in alcun modo) è quello Se La lingua è essenzialmente convertita in qualcos'altro, allora che "qualcos'altro" deve essere il superset della fonte. Quindi Bytecode è necessariamente un superset di Java. .NET IL è un superset di C# e di F#. I costrutti funzionali in C# (cioè LINQ) sono quindi un sottoinsieme dei costrutti imperativi di IL.

Poiché il linguaggio della macchina è indispensabile, è possibile assumere la posizione che, quindi, tutte le lingue sono indispensabili, perché sono solo astrazioni utili per gli esseri umani che vengono poi bolliti dal compilatore al codice macchina procedurale e imperativo.

Mappatura del modello come

f:: [int] -> int
f [] = 0
f (x:xs) = 1 + f(xs)

è qualcosa che è ad esempio una cosa che non è disponibile nelle lingue imperative. Costruisce anche come funzioni al curry:

add2 :: int -> int
add2 = (2 +)

non è disponibile nella maggior parte delle lingue imperative

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top