it-swarm-eu.dev

Ist Javascript eine funktionale Programmiersprache?

  • Ist Javascript eine funktionale Sprache? Ich weiß, dass es Objekte hat und Sie können OOP auch damit machen, aber ist es auch eine funktionale Sprache, kann es auf diese Weise verwendet werden?
  • Sie wissen, wie OOP wurde/scheint die nächste Entwicklung in der Programmierung zu sein, bedeutet das, dass 'Functional Programming' die nächste Entwicklung ist (Hinweis: Dies ist KEINE Aufforderung zur Stellungnahme, ABER eine Aufforderung zur Abgabe einer sachliche evidenzbasierte Antwort & dieser Hinweis ist mehr für die Moderatoren als für die Mitwirkenden;)).
  • Ich lerne am besten anhand von Beispielen, vielleicht könnte jemand zeigen, wie er dieselbe Aufgabe auf eine OOP Weise und dann auf eine funktionale Programmierweise) ausführt, um zu verstehen und zu vergleichen, was funktionale Programmierung tut/ist.

Um ehrlich zu sein, verstehe ich 'Functional Programming' nicht wirklich vollständig: P Der Vergleich von Javascript mit Functional Programming kann also völlig falsch sein.

Um die funktionale Programmierung in Laienbegriffe zu fassen: Ist es einfach der Vorteil einer Abstration durch anonyme Funktionen?

Oder ist das zu einfach? Auf einfache Weise ist OOP der Vorteil der Abstraktion durch Objekte, aber ich glaube, das ist etwas zu simpel, um OOP zu beschreiben.

Ist das ein gutes Beispiel für funktionale Programmierung? ...

Javascript OOP Beispiel:

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

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

Beispiel für eine funktionale Programmierung:

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]);
35
Marek

Ist Javascript eine funktionale Sprache? Ich weiß, dass es Objekte hat und Sie können OOP auch damit machen, aber ist es auch eine funktionale Sprache, kann es auf diese Weise verwendet werden?

Manchmal sagen die Leute funktionale Programmierung, wenn sie imperative Programmierung oder prozedurale Programmierung meinen. Genau genommen ist funktionale Programmierung :

In der Informatik ist funktionale Programmierung ein Programmierparadigma, das Berechnung als Bewertung mathematischer Funktionen behandelt und Zustands- und veränderbare Daten vermeidet . Es betont die Anwendung von Funktionen im Gegensatz zum imperativen Programmierstil, der Zustandsänderungen betont. Die funktionale Programmierung hat ihre Wurzeln in der Lambda-Rechnung, einem formalen System, das in den 1930er Jahren entwickelt wurde, um Funktionsdefinition, Funktionsanwendung und Rekursion zu untersuchen. Viele funktionale Programmiersprachen können als Ausarbeitungen des Lambda-Kalküls angesehen werden.

Obwohl Javascript nicht allgemein bekannt ist oder als funktionale Sprache verwendet wird, hat es einige funktionale Elemente :

JavaScript hat viel mit Scheme gemeinsam. Es ist eine dynamische Sprache. Es verfügt über einen flexiblen Datentyp (Arrays), mit dem S-Ausdrücke einfach simuliert werden können. Und vor allem sind Funktionen Lambdas.

Schema ist ein Dialekt von LISP und wahrscheinlich eine der Sprachen, an die die meisten Programmierer denken, wenn sie über funktionale Programmierung sprechen. Wenn es um Objektorientierung geht, ist Javascript eine objektorientierte Sprache. Aber seine Objektorientierung ist prototypbasiert :

Prototypbasierte Programmierung ist ein Stil der objektorientierten Programmierung, bei dem keine Klassen vorhanden sind, und die Wiederverwendung von Verhalten (in klassenbasierten Sprachen als Vererbung bezeichnet) erfolgt über einen Prozess zum Klonen vorhandener Objekte, die als Prototypen dienen. Dieses Modell kann auch als klassenlose, prototyporientierte oder instanzbasierte Programmierung bezeichnet werden. Delegation ist die Sprachfunktion, die prototypbasierte Programmierung unterstützt.

Obwohl Javascript objektorientiert ist, folgt es nicht dem allgemeineren klassenbasiertes Modell , ebenso wie Sprachen wie C++, C #, Java und PHP (und einige andere). Und natürlich ist es auch eine zwingende Sprache, was zu der Verwechslung mit der oben beschriebenen funktionalen Programmierung führt.

Sie wissen, wie OOP wurde/scheint die nächste Evolution in der Programmierung zu sein, bedeutet das, dass 'Functional Programming' die nächste Evolution ist

Objektorientierung und funktionale Programmierung sind nur zwei der vielen verschiedenen Programmierparadigmen , sie sind verschiedene Programmierstile mit unterschiedlichen Konzepten und Abstraktionen. Das Schlüsselwort ist "anders". Es gibt kein einziges Paradigma, das besser als andere oder weiterentwickelt als andere ist. Jedes Paradigma passt besser zu einigen Szenarien als die anderen. Einige mögen in Origin etwas älter sein als andere, aber in evolutionärer Hinsicht macht sie das besser, da sie länger überlebt haben. Aber das ist keine sehr kluge Sichtweise.

Javascript ist, wie ich oben und in einigen anderen Sprachen beschrieben habe, ein Multiparadigma. Es ermöglicht Ihnen, Code in einem imperativen, prototypbasierten objektorientierten und funktionalen Stil zu schreiben. Es liegt an Ihnen zu entscheiden, welches am besten zu dem passt, was Sie bauen. Es gibt auch mehrere einzelne Paradigmensprachen, das kanonische Beispiel ist Java, das nur klassenbasierte objektorientierte Programmierung ermöglicht1.

Sie sollten sich wirklich jedem Drang widersetzen, Sprachen und Paradigmen als modische Aussagen zu behandeln. Es gibt da draußen eine Menge Mist, meistens geschrieben von Fanboys/Fangirls oder Marketing-Leuten, mit wenig (wenn überhaupt) Wissen und Verständnis für Programmierung. Begriffe wie "besser", "weiterentwickelt" usw. gelten einfach nicht.

Ich lerne am besten anhand von Beispielen, vielleicht könnte jemand zeigen, wie er dieselbe Aufgabe auf eine OOP Weise und dann auf eine funktionale Programmierweise) ausführt, damit ich verstehe und vergleiche, was funktionale Programmierung tut/ist.

Das wäre eine schreckliche Art zu lernen. Funktions- und Objektorientierung sind sehr unterschiedliche Stile, und jedes andere Beispiel als schrecklich einfache würde nicht zu dem einen oder anderen Stil passen.

1 Aber in letzter Zeit wird versucht, seinen Anwendungsbereich auf die generische Programmierung auszudehnen. Mal sehen, wie das geht.


Abschließend:

  • Konzentrieren Sie sich auf das Erlernen von Javascript, es ist eine schöne und äußerst nützliche Sprache. Lerne die Sprache, nicht den Hype.
  • Nicht wenige verschiedene Paradigmen, alle gleichermaßen nützlich. Sie können selbst entscheiden, welches Sie bevorzugen und welches am besten zu dem passt, was Sie bauen.
  • Wenn Sie funktionale Programmierung lernen möchten, wählen Sie eine geeignetere Sprache wie Schema oder Clojure . Aber Sie müssen zuerst die mathematischen Konzepte verstehen.
  • Recherchiere, bevor du fragst. Die meisten Ihrer Fragen werden von den entsprechenden Wikipedia-Artikeln beantwortet. Zu wissen, wie man recherchiert und fragt, ist für jeden Programmierer eine äußerst wichtige Fähigkeit.
73
yannis

Javascript kann als funktionale Sprache verwendet werden, in der Tat ist es ziemlich gut. Es ist möglich, Monaden zu implementieren, das ein Lambda-Konstrukt usw. unterstützt. Es ist nicht ausschließlich eine funktionale Sprache, da es auch viele objektorientierte Merkmale aufweist, aber auf diese Weise verwendet werden kann. Eigentlich finde ich, dass die Verwendung von Javascript als funktionale Sprache eine großartige Möglichkeit ist, es zu verwenden. (Beispiel jQuery und underscore.js)

8
Zachary K

Evolution bedeutet normalerweise eine inkrementelle Änderung. OOP ist keine inkrementelle Ergänzung der prozeduralen Programmierung - tatsächlich ist es vollständig orthogonal zu einem zugrunde liegenden Programmiermodell und kann mit jedem von ihnen kombiniert werden. Die funktionale Programmierung ist keine inkrementelle Ergänzung der prozeduralen Programmierung , OOP oder was auch immer - es ist eine alternative Basis , um grundlegende Rechenprinzipien auszudrücken, und es ist tatsächlich die erste solche Basis, die jemals formuliert wurde, lange bevor die ersten Computer erschienen. Es ist wichtig zu verstehen, dass alle diese grundlegenden Systeme äquivalent sind (dh man kann in Begriffen ausgedrückt werden eines anderen).

Um den funktionalen Ansatz zu verstehen, müssen Sie zuerst das grundlegende Mathematik erhalten. Wenn Sie ein Gefühl dafür bekommen möchten, was es bedeutet, in Javascript in einem funktionalen Stil zu codieren, verwenden Sie jQuery .

6
SK-logic

Javascript ist in erster Linie ein Prototyp mit funktionalen Fähigkeiten, die durch die Verwendung von Funktionen als erstklassige Objekte gewährt werden.

Dies bedeutet, dass Sie Funktionen als Daten verwenden können, was den merkwürdigen Effekt hat, dass weniger Variablen benötigt werden, die den Status beibehalten. Wenn Sie feststellen, dass Sie nach der var-Anweisung greifen oder eine oder mehrere "if" -Anweisungen verwenden, weichen Sie von einem funktionalen Stil ab.

Eine weitere bemerkenswerte Besonderheit des funktionalen Stils besteht darin, dass Funktionen NUR das Ergebnis ihrer Bewertung zurückgeben und keine Nebenwirkungen auf den Zustand außerhalb ihres Anwendungsbereichs haben sollten:

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

Funktionssprachen sind zerstörungsfrei - das heißt, sie mutieren die Eingabe nicht, sondern geben basierend auf der Eingabe völlig neue Daten zurück. Siehe diesen Thread: https://stackoverflow.com/questions/749084/jquery-map-vs-each

Funktionale Sprachen haben auch viele gemeinsame Methoden - mit Namen wie "map", "fold", "redu", die Listen/Sammlungen verarbeiten. In JS müssen wir diese im Gegensatz zu anderen Sprachen von Hand ins Leben rufen - siehe Bibliotheken wie underscore.js für einige Beispiele, obwohl die neueste Implementierung von JS dies getan hat Einige davon direkt aus der Schachtel.

Das Wichtigste, was zu beachten ist (IMO), ist, dass JS zwar einige Funktionsmuster verwenden kann, für die Ausführung jedoch nicht immer gut gerüstet ist.

Nehmen Sie zum Beispiel die Iteration über ein Array. Sie können dies mit einem funktionalen Stil oder den nativen Schleifenkonstrukten tun - und im Allgemeinen ist die Schleife performanter. Nehmen Sie dieses Beispiel - schlagen Sie es mit Schleifen von zunehmender Größe und zeichnen Sie die Ausführungszeiten in verschiedenen Browsern auf (ich habe dies bereits getan, aber ich habe die Benchmarks verloren - sorry!):

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;
    }
}

Wenn Sie ein funktionales Konstrukt verwenden, um Schleifen von beträchtlicher Größe zu treffen, und keine Form der Ad-hoc-Stapelverwaltung verwenden, können Sie den Stapel überfluten (obwohl Sie, um fair zu sein, eine GROSSE Liste benötigen, damit dies auftritt. ..). Sie müssen auch die Variantenoptimierungen in jedem Browser berücksichtigen - obwohl dies, wenn Sie in einer Node.js-Umgebung arbeiten, offensichtlich eher ein festes Ziel ist.

Das heißt nicht, dass Sie in Javascript keine funktionalen Konstrukte verwenden sollten - beachten Sie nur die Einschränkungen bei der Implementierung in Bezug auf die Umgebung.

Hier sind einige Links, die für Sie von Interesse sein könnten:

Ein gutes Kapitel über funktionale Programmierung in Javascript aus dem ausgezeichneten "Eloquent Javascript"

Der kleine Schemer

ein Freund von mir hat eine JS-Bibliothek geschrieben, die auf dem kleinen Schemer basiert

Ein gutes Tutorial zum Schema, das Ihnen helfen könnte, FP besser zu verstehen

2
sunwukung

Nein.

JavaScript ist in erster Linie eine objektorientierte Sprache.

Das heißt nicht, dass Sie keine JavaScript-Programme in einem funktionalen Stil schreiben können, da Sie einen funktionalen Stil in any Turing verwenden können, wenn Sie sich genug anstrengen. Wenn Sie möchten, können Sie im Assembler eine funktionale Programmierung durchführen. Aber das macht nicht jede Sprache funktionsfähig. Sie können Haskell genauso gut als Imperativ oder Java eine logische Programmiersprache - bezeichnen - wenn Sie diesen Ansatz wählen, werden die Begriffe bald bedeutungslos.

IMO Der Weg, eine Sprache in das entsprechende Paradigma zu klassifizieren, besteht darin, Folgendes zu berücksichtigen:

  • Was ist der dominante Stil, der durch die Sprachkonstrukte ermöglicht wird (klar OOP für JavaScript, funktionale Sprachen betonen stattdessen Funktionen und unveränderliche Datenwerte)
  • Welches Paradigma wird in den Kernbibliotheken der Sprache unterstützt (wieder klar OOP für JavaScript)
  • Welche Funktionen in der Sprache deaktiviert oder entmutigt sind (funktionale Sprachen entmutigen oder verbieten veränderbare Variablen, was bei JavaScript nicht der Fall ist)?
  • Welcher Entwicklungsstil in der Entwicklergemeinschaft, die die Sprache verwendet, vorherrscht (wiederum OOP ist in der JavaScript-Welt eindeutig vorherrschend)

Persönlich finde ich es ziemlich amüsant, dass viele Leute gerne behaupten, eine Sprache sei "funktional", nur weil es im Moment ein Trendbegriff ist :-)

Wenn Sie eine etwas lange, aber unterhaltsame Perspektive auf Programmierparadigmen im Laufe der Jahre wünschen, sollten Sie sich Onkel Bob Martins Video "The Last Programming Language" ansehen. Für mich war die großartige Erkenntnis aus diesem Vortrag, dass Programmierparadigmen durch welche Funktionen sie wegnehmen definiert werden, nicht durch welche Funktionen sie einfügen ......

2
mikera