JavaScript è un linguaggio di programmazione funzionale

33
  • Javascript è un linguaggio funzionale? So che ha oggetti e amp; puoi anche fare OOP con esso, ma è anche un linguaggio funzionale, può essere usato in questo modo?
  • Sai come OOP è diventato / sembra la prossima evoluzione nella programmazione, vuol dire che la "Programmazione funzionale" è la prossima evoluzione (Nota: questo NON è un suggerimento per l'opinione, MA un suggerimento per una risposta basata su prove concrete, & amp questa nota è più per i moderatori che per i contributori;)).
  • Imparo meglio attraverso gli esempi, forse qualcuno potrebbe mostrare di eseguire lo stesso compito in un modo OOP & poi in un modo di programmazione funzionale per me stesso per capire & confronta ciò che fa / è la programmazione funzionale.

In realtà non capisco completamente che la "programmazione funzionale" sia onesta: P Quindi il confronto tra Javascript e programmazione funzionale potrebbe essere completamente scorretto.

Mettere la programmazione funzionale in parole semplici: è semplicemente il vantaggio dell'astrazione ATTRAVERSO l'uso di funzioni anonime?

O è troppo semplice? In un modo semplice, OOP è il vantaggio dell'astrazione attraverso gli oggetti, ma credo che sia un po 'troppo semplicistico per descrivere OOP.

Questo è un buon esempio di programmazione funzionale? ...

Esempio OOP JavaScript:

// sum some numbers
function Number( v )
{ 
  this.val = v;
}

Number.prototype.add( /*Number*/ n2 )
{
    this.val += n2.val;
}

Esempio di programmazione funzionale:

function forEach(array, action) 
{
   for (var i = 0; i < array.length; i++)
       action(array[i]);
}  

function add(array)
{
    var i=0;
    forEach(array, function(n)
    {
        i += n;
    });
    return i;
}

var res = add([1,9]);
    
posta Marek 30.12.2011 - 08:35
fonte

5 risposte

67

Is Javascript a functional language? I know it has objects & you can do OOP with it also, but is it also a functional language, can it be used in that way?

A volte, le persone diranno la programmazione funzionale, quando ciò che intendono è programmazione imperativa o programmazione procedurale . A rigor di termini, programmazione funzionale è:

In computer science, functional programming is a programming paradigm that treats computation as the evaluation of mathematical functions and avoids state and mutable data. It emphasizes the application of functions, in contrast to the imperative programming style, which emphasizes changes in state. Functional programming has its roots in lambda calculus, a formal system developed in the 1930s to investigate function definition, function application, and recursion. Many functional programming languages can be viewed as elaborations on the lambda calculus.

Sebbene Javascript non sia ampiamente conosciuto o usato come linguaggio funzionale, ha alcuni elementi funzionali :

JavaScript has much in common with Scheme. It is a dynamic language. It has a flexible datatype (arrays) that can easily simulate s-expressions. And most importantly, functions are lambdas.

Schema è un dialetto di Lisp , e probabilmente una delle lingue che la maggior parte dei programmatori pensa quando discutono di programmazione funzionale. Quando si tratta di orientamento degli oggetti , Javascript è un linguaggio orientato agli oggetti. Ma il suo orientamento agli oggetti è basato sul prototipo :

Prototype-based programming is a style of object-oriented programming in which classes are not present, and behavior reuse (known as inheritance in class-based languages) is performed via a process of cloning existing objects that serve as prototypes. This model can also be known as classless, prototype-oriented or instance-based programming. Delegation is the language feature that supports prototype-based programming.

Quindi, anche se Javascript è orientato agli oggetti, non segue il più comune modello basato sulla classe , così come lingue come C ++, C #, Java e PHP (e molte altre). E naturalmente è anche un linguaggio imperativo, che porta alla confusione con la programmazione funzionale che ho descritto sopra.

You know how OOP became/seems like the next evolution in programming, does that mean that 'Functional Programming' is the next evolution

L'orientamento degli oggetti e la programmazione funzionale sono solo due dei molti diversi paradigmi di programmazione , sono diversi stili di programmazione con diversi concetti e astrazioni. La parola chiave è "diversa". Non esiste un singolo paradigma che sia migliore di altri o più evoluto di altri, ognuno si adatta ad alcuni scenari meglio degli altri. Alcuni potrebbero essere di origine più antica di altri, ma in termini evolutivi che li rendono migliori, poiché sono sopravvissuti più a lungo. Ma non è un modo molto intelligente di guardarlo.

Javascript, come ho descritto sopra e come molti altri linguaggi, è multi-paradigma. Ti permette di scrivere codice in stile imperativo, basato su prototipi e orientato agli oggetti. Sta a te scegliere quale si adatta meglio a qualsiasi cosa tu stia costruendo. Esistono anche diversi linguaggi di paradigma, l'esempio canonico è Java, che consente solo la programmazione orientata agli oggetti basata sulla classe 1 .

Dovresti davvero resistere a qualsiasi voglia di trattare lingue e amp; paradigmi come dichiarazioni di moda. C'è un'abudine di merda là fuori, per lo più scritta da fanboy / fangirls o persone di marketing, con poca (se non nessuna) conoscenza e comprensione della programmazione. Termini come "migliore", "più evoluto" ecc., Semplicemente non si applicano.

I learn best through examples, maybe someone could show performing the same task in a OOP way & then in a Functional Programming way for myself to understand & compare what functional programming does/is.

Sarebbe un modo terribile di imparare. L'orientamento funzionale e dell'oggetto sono stili molto diversi, e qualsiasi esempio diverso da quelli terribilmente semplici non si adatterebbe all'uno o all'altro stile.

1 Ma ultimamente cerca di estendere il suo ambito alla programmazione generica, vediamo come va.

In conclusione:

  • Concentrati sull'apprendimento di Javascript, è un linguaggio bellissimo ed estremamente utile. Impara la lingua, non l'esagerazione.
  • Parecchi diversi paradigmi, tutti ugualmente utili. Fino a te per scegliere quale preferisci e quale si adatta meglio a quello che stai costruendo.
  • Se vuoi imparare la programmazione funzionale, scegli una lingua più adatta, come Schema o Clojure . Ma prima devi capire i concetti matematici coinvolti.
  • Fai qualche ricerca prima di chiedere. La maggior parte delle tue domande riceve risposta dagli articoli di Wikipedia pertinenti. Sapere come ricercare e come chiedere è un'abilità estremamente importante per qualsiasi programmatore.
risposta data 30.12.2011 - 09:05
fonte
7

Javascript può essere usato come un linguaggio funzionale, infatti lo fa abbastanza bene. È possibile implementare monadi ha il supporto per un costrutto lambda, ecc. Non è un linguaggio esclusivamente funzionale in quanto ha anche molte funzioni orientate agli oggetti, ma può essere usato in questo modo. In realtà trovo che usare Javascript come linguaggio funzionale sia un ottimo modo per usarlo. (Esempio jQuery e underscore.js)

    
risposta data 30.12.2011 - 11:50
fonte
6

Evolution normalmente significa una modifica incrementale . OOP non è un'aggiunta addizionale alla programmazione procedurale - infatti, è interamente ortogonale a un modello di programmazione sottostante e può essere combinata con uno qualsiasi di essi. La programmazione funzionale non è un'aggiunta incrementale a procedurale, OOP o qualsiasi altra cosa - è una base alternativa per esprimere principi di calcolo fondamentali, ed è in realtà la prima base di questo tipo mai formulata, molto prima che comparissero i primi computer. È importante capire che tutti questi sistemi fondamentali sono equivalenti (cioè, uno può essere espresso in termini di un altro).

Per comprendere l'approccio funzionale, devi prima ottenere la matematica di base . Se vuoi avere un'idea di cosa significa codificare in uno stile in Javascript, inizia a utilizzare jQuery .

    
risposta data 30.12.2011 - 09:34
fonte
2

No.

JavaScript è innanzitutto un linguaggio orientato agli oggetti.

Questo non vuol dire che non puoi scrivere programmi JavaScript in uno stile funzionale, dal momento che puoi adottare uno stile funzionale in qualsiasi completo di Turing se ti sforzi abbastanza. Puoi fare programmazione funzionale in assembler, se vuoi. Ma questo non rende tutte le lingue funzionali. Potresti ugualmente chiamare Haskell imperativo, o Java un linguaggio di programmazione logica - se tu prendessi questo approccio, i termini diventerebbero presto privi di significato.

IMO il modo per classificare una lingua nel paradigma appropriato è considerare:

  • Qual è lo stile dominante abilitato dai costrutti del linguaggio (chiaramente OOP per JavaScript, i linguaggi funzionali enfatizzano invece le funzioni e i valori dei dati immutabili)
  • Quale paradigma è supportato nelle librerie principali del linguaggio (di nuovo chiaramente OOP per JavaScript)
  • Quali funzionalità sono disabilitate o scoraggiate nella lingua (le lingue funzionali scoraggiano o vietano le variabili mutabili, che non è il caso per JavaScript)
  • Quale stile di sviluppo è prevalente nella comunità di sviluppatori che usano il linguaggio (di nuovo, OOP è chiaramente prevalente nel mondo JavaScript)

Personalmente trovo piuttosto divertente che molte persone amano reclamare una lingua sia "funzionale" solo perché è un termine di moda al momento: -)

Se desideri una prospettiva leggermente lunga ma divertente sui paradigmi di programmazione nel corso degli anni, vale la pena di guardare Zio Bob Il video di Martin "The Last Programming Language" . Per me la grande intuizione di questo discorso è stata che i paradigmi di programmazione sono definiti da quali caratteristiche tolgono , non quali caratteristiche mettono in ......

    
risposta data 12.01.2012 - 10:02
fonte
2

Javascript è prototipale per primo, con funzionalità funzionali, grazie al suo uso di funzioni come oggetti di prima classe.

Ciò significa che è possibile utilizzare le funzioni come dati, che ha l'effetto curioso di ridurre la necessità di variabili che mantengono lo stato. Se ti accorgi che stai raggiungendo l'istruzione var, o stai utilizzando una o più istruzioni "if", allora ti stai allontanando da uno stile funzionale.

Un altro notevole idiosincrasia dello stile funzionale è che le funzioni dovrebbero SOLO restituire il risultato della loro valutazione e non avere effetti collaterali sullo stato al di fuori del loro ambito:

// oops, this is producing a side effect
function sideEffecter(){//theres no input...        
    window.thingy = 'foo';
    // hey, this isn't returning anything!!!
} 

I linguaggi funzionali non sono distruttivi, ovvero non mutano l'input, ma restituiscono interamente nuovi dati in base all'input. Vedi questo thread: link

I linguaggi funzionali presentano anche molti metodi in comune, con nomi come "mappa", "piega", "riduzione" di elenchi / raccolte di processi. In JS, a differenza di altri linguaggi, dobbiamo metterli a frutto in un'esistenza - vedi alcune librerie come underscore.js per alcuni esempi, anche se l'ultima implementazione di JS ne ha alcuni direttamente fuori dagli schemi.

La cosa importante da tenere a mente (IMO) è che mentre JS può utilizzare alcuni modelli funzionali, non è sempre ben attrezzato per l'esecuzione in quel momento.

Ad esempio, iterare su un array. Puoi farlo usando uno stile funzionale o i costrutti del ciclo nativo - e in generale il ciclo è più performante. Prendi questo esempio: colpiscilo con loop di dimensioni crescenti e registra i tempi di esecuzione in browser diversi (l'ho già fatto, ma ho perso i benchmark - scusa!):

var test = ['foo', 'bar', 'baz'], removeFunc, removeLoop;

//(semi)functional style...
// to be really functional each condition in the ternary would be another function
removeFunc = function(src, trg) {
    return src.length === 0 ? 
        src : 
            src[0] === trg ? 
                src.slice(1) : 
                    [src[0]].concat(removeFunc(src.slice(1), trg));
};

//but this is faster
removeLoop = function(src, trg){
    var len = src.length, // using variables to represent state...
        i=0, 
        result = [];        
    while(i < n){
       if(src[i] !== trg){
          result.push(src[i]);
       }
       i = i+1;
    }
}

Inoltre, se si utilizza un costrutto funzionale per ottenere loop di dimensioni considerevoli e non si utilizza una qualche forma di gestione dello stack ad hoc, si potrebbe inondare lo stack (anche se, per essere onesti, è necessario un elenco GRANDE per questo verificare...). Devi anche prendere in considerazione il mix delle ottimizzazioni delle varianti in ogni browser, anche se se stai lavorando in un ambiente Node.js questo è ovviamente più di un obiettivo fisso.

Questo non vuol dire che non si dovrebbero usare costrutti funzionali in Javascript, ma solo essere consapevoli dei limiti nella sua implementazione rispetto al proprio ambiente.

Ecco alcuni link che potrebbero interessarti:

Un buon capitolo sulla programmazione funzionale in Javascript dall'ottimo "Eloquent Javascript"

The Little Schemer

un mio amico ha scritto una libreria JS basata su Little Schemer

Un buon tutorial su Scheme che potrebbe aiutarti a comprendere meglio FP

    
risposta data 13.01.2012 - 11:02
fonte

Leggi altre domande sui tag