- Ist Javascript eine funktionale Sprache? Ich weiß, es hat Objekte und Sie können OOP damit auch machen, aber ist es auch eine funktionale Sprache, kann es auf diese Weise verwendet werden?
- Sie wissen, wie OOP die nächste Evolution in der Programmierung wurde / scheint. Bedeutet dies, dass 'Funktionale Programmierung' die nächste Evolution ist (Hinweis: Dies ist KEINE Aufforderung zur Stellungnahme, ABER eine Aufforderung zur faktenbasierten Beantwortung, und 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 man dieselbe Aufgabe auf eine OOP-Art 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 Ein Vergleich von Javascript mit funktionaler Programmierung kann also völlig falsch sein.
Funktionale Programmierung in einfachen Worten ausgedrückt: Ist es einfach der Vorteil von Abstration durch Verwendung anonymer Funktionen?
Oder ist das zu einfach? Auf einfache Weise ist OOP der Vorteil der Abstraktion durch Objekte, aber ich glaube, dass dies etwas zu einfach ist, um OOP zu beschreiben.
Ist dies 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;
}
Funktionsprogrammierbeispiel:
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]);
Or is that way too simple?
Ja, das ist es. Anonyme Funktionen werden manchmal mit funktionalen Sprachen und Multi-Paradigmen-Sprachen assoziiert, die die funktionale Programmierung bevorzugen, aber sie sind kein eindeutiges Merkmal von funktionalen Sprachen. Aber wenn man sie als eine Implementierung von λ-Kalkül betrachtet, dann sind sie ein zentraler Bestandteil der funktionalen Programmierung. Der wichtigste Punkt ist, dass es nicht so einfach ist :)I know it has objects & you can do OOP with it also
Nein, kannst du nicht. Es ist eine prototypbasierte Programmierung, die die Unterscheidung zwischen Klasse und Objekt beseitigt. Persönlich betrachte ich die prototypbasierte Programmierung auf dieser Basisebene als fehlerhaft.Antworten:
Manchmal sagen die Leute funktionale Programmierung, wenn sie imperative Programmierung oder prozedurale Programmierung meinen . Funktionale Programmierung ist genau genommen :
Obwohl Javascript nicht allgemein bekannt ist oder als funktionale Sprache verwendet wird, hat es einige funktionale Elemente :
Schema ist ein Lisp- Dialekt und wahrscheinlich eine der Sprachen, an die die meisten Programmierer denken, wenn sie über funktionale Programmierung sprechen. Bei der Objektorientierung ist Javascript eine objektorientierte Sprache. Die Objektorientierung basiert jedoch auf Prototypen :
Obwohl Javascript objektorientiert ist, folgt es nicht dem gängigeren klassenbasierten Modell , ebenso wenig wie Sprachen wie C ++, C #, Java und PHP (und einige andere). Und natürlich ist es auch eine imperative Sprache, die zu der Verwechslung mit der oben beschriebenen funktionalen Programmierung führt.
Objektorientierung und funktionale Programmierung sind nur zwei von vielen verschiedenen Programmierparadigmen , sie sind unterschiedliche 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 einzelne passt besser zu bestimmten Szenarien als die anderen. Einige sind möglicherweise älter als andere, aber evolutionär gesehen sind sie dadurch besser, da sie länger überlebt haben. Aber das ist keine sehr kluge Sichtweise.
Javascript ist, wie ich oben und einige andere Sprachen beschrieben habe, ein Multiparadigma. Sie können Code in einem imperativen, prototypbasierten, objektorientierten und funktionalen Stil schreiben. Es liegt an Ihnen zu entscheiden, welches am besten zu dem passt, was Sie bauen. Es gibt auch mehrere einzelne Paradigmasprachen, das kanonische Beispiel ist Java, das nur eine klassenbasierte objektorientierte Programmierung ermöglicht 1 .
Sie sollten wirklich jedem Drang widerstehen, Sprachen und Paradigmen als modische Aussagen zu behandeln. Es gibt eine Menge Mist da draußen, meistens geschrieben von Fanboys / Fangirls oder Marketingleuten, mit wenig (wenn überhaupt) Wissen und Verständnis für Programmierung. Begriffe wie "besser", "weiterentwickelt" usw. gelten einfach nicht.
Das wäre eine schreckliche Art zu lernen. Funktionale und Objektorientierung sind sehr unterschiedliche Stile, und jedes andere als schrecklich einfache Beispiel würde nicht zu dem einen oder anderen Stil passen.
1 Aber in letzter Zeit versucht, seinen Anwendungsbereich auf generische Programmierung zu erweitern, mal sehen, wie das geht.
Abschließend:
quelle
Javascript kann als funktionale Sprache verwendet werden, in der Tat macht es das ganz gut. Es ist möglich, Monaden zu implementieren, die Unterstützung für ein Lambda-Konstrukt usw. haben. Es ist nicht ausschließlich eine funktionale Sprache, da es auch viele objektorientierte Merkmale hat, 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)
quelle
Evolution bedeutet normalerweise eine inkrementelle Veränderung. OOP ist keine inkrementelle Ergänzung der prozeduralen Programmierung - tatsächlich ist es völlig orthogonal zu einem zugrunde liegenden Programmiermodell und kann mit jedem von ihnen kombiniert werden. Funktionale Programmierung ist keine inkrementelle Ergänzung zu prozeduralem, OOP oder was auch immer - sie ist eine alternative Basis zum Ausdrücken grundlegender Rechenprinzipien, und sie ist tatsächlich die erste derartige Basis, die jemals formuliert wurde, lange bevor die ersten Computer aufgetaucht sind. Es ist wichtig zu verstehen, dass alle diese grundlegenden Systeme gleichwertig sind (dh eines kann in Form eines anderen ausgedrückt werden).
Um den funktionalen Ansatz zu verstehen, müssen Sie zuerst die Grundrechenarten erlernen . Wenn Sie ein Gefühl dafür bekommen möchten, was es bedeutet, in JavaScript in einem funktionalen Stil zu codieren , beginnen Sie mit der Verwendung von jQuery .
quelle
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 jeder Turing-Sprache anwenden können, wenn Sie sich anstrengen. Sie können die Funktionsprogrammierung in Assembler durchführen, wenn Sie möchten. Dies macht jedoch nicht jede Sprache funktionsfähig. Genauso gut können Sie Haskell imperative oder Java als logische Programmiersprache bezeichnen - wenn Sie diesen Ansatz wählen, werden die Begriffe bald bedeutungslos.
IMO die Art und Weise, eine Sprache in das entsprechende Paradigma zu klassifizieren, ist zu berücksichtigen:
Persönlich finde ich es ziemlich amüsant, dass viele Leute gerne behaupten, eine Sprache sei "funktional", nur weil es im Moment ein Modebegriff ist :-)
Wenn Sie eine etwas lange, aber unterhaltsame Perspektive auf Programmierparadigmen im Laufe der Jahre haben möchten, 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 die Eigenschaften definiert sind, die sie wegnehmen , nicht durch die Eigenschaften, die sie einbauen.
quelle
What is the dominant style enabled by the language constructs
Ich wage dich, das auf Perl anzuwenden ... oder auf irgendeinen anderen deiner Punkte, wirklich :)Javascript ist in erster Linie prototypisch und verfügt über funktionale Funktionen, die durch die Verwendung von Funktionen als erstklassige Objekte gewährleistet 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 ist, dass Funktionen NUR das Ergebnis ihrer Bewertung zurückgeben sollten und keine Nebenwirkungen auf den Zustand außerhalb ihres Bereichs haben:
Funktionale Sprachen sind nicht destruktiv. Das bedeutet, dass sie die Eingabe nicht mutieren, sondern basierend auf der Eingabe völlig neue Daten zurückgeben. Siehe diesen Thread: https://stackoverflow.com/questions/749084/jquery-map-vs-each
Funktionale Sprachen bieten auch viele Methoden, die gemeinsam sind - mit Namen wie "map", "fold", "reduction", die Listen / Sammlungen verarbeiten. In JS müssen wir diese im Gegensatz zu anderen Sprachen manuell in die Existenz bringen. In Bibliotheken wie underscore.js finden Sie einige Beispiele, obwohl die neueste Implementierung von JS einige davon bereits enthält.
Das Wichtigste, das zu beachten ist (IMO), ist, dass JS zwar einige Funktionsmuster verwenden kann, aber nicht immer gut für die Ausführung geeignet ist.
Nehmen Sie zum Beispiel das Durchlaufen eines Arrays. Sie können dazu einen funktionalen Stil oder die nativen Schleifenkonstrukte verwenden - und im Allgemeinen ist die Schleife performanter. Nehmen Sie dieses Beispiel - schlagen Sie es mit Schleifen zunehmender Größe an und zeichnen Sie die Ausführungszeiten in verschiedenen Browsern auf (das habe ich bereits getan, aber ich habe die Benchmarks verloren - sorry!):
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 fairerweise eine GROSSE Liste benötigen, damit dies auftritt. ..). Sie müssen auch die Variantenoptimierungen in jedem Browser berücksichtigen - obwohl dies offensichtlich eher ein festes Ziel ist, wenn Sie in einer Node.js-Umgebung arbeiten.
Das heißt nicht, dass Sie keine funktionalen Konstrukte in Javascript 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 exzellenten "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
quelle