Ist Javascript eine funktionale Programmiersprache?

135

Nur weil Funktionen erstklassige Objekte sind, es Verschlüsse und Funktionen höherer Ordnung gibt, verdient Javascript es, als funktionale Programmiersprache bezeichnet zu werden? Die Hauptsache, von der ich denke, dass sie fehlt, sind reine Funktionen, und sie fühlen sich nicht wie andere funktionale Sprachen wie Lisp an (obwohl dies kein guter Grund dafür ist, keine funktionale Sprache zu sein ...)

hvgotcodes
quelle
12
@ Slashmais: Nein! Das verhindert nur, dass es eine reine (ly) funktionale Sprache ist. ML (zumindest moderne Dialekte) sind ebenfalls unrein - aber niemand würde es wagen, sie als nicht funktionsfähig zu bezeichnen;)
4
Es gibt viele Sprachen, die allgemein als funktional angesehen werden, aber nicht rein sind. Ich sehe nicht, wie das eine Voraussetzung ist. Wenn Sie so streng sein wollen, dann sind die meisten sogenannten OOP-Sprachen auch keine OOP. Am Ende sind etwa 95% aller Sprachen keine Paradigmensprachen.
Jalf
6
Warum ist es aber wichtig? Wenn ich in C ++ codiere, ist es mir egal, ob die Sprache "OOP" ist oder nicht. Es ist mir wichtig, dass es bestimmte OOP-Funktionen hat und dass es einige funktionale Programmierfunktionen und viele wichtige Programmierfunktionen und viele allgemeine Programmierfunktionen hat. Aber ob es eine OOP-Sprache oder eine FP-Sprache oder etwas anderes ist, spielt keine Rolle. Ebenso spielt es beim Codieren in JS keine Rolle, ob es sich um FP handelt oder nicht. Was zählt ist, dass es viele nette FP-Funktionen unterstützt. Es scheint, dass dies die falsche Frage ist.
Jalf
3
@hvgotcodes: also? Es gibt absolut keine Regel, die besagt, dass dies nicht der Fall ist. Meine Faustregel lautet, dass es sich um eine funktionale Sprache handelt, wenn Sie damit in einem funktionalen Stil programmieren können. Da Javascript erstklassige Funktionen, Verschlüsse und Lambdas hat, glaube ich, dass Sie es können, und soweit es mich betrifft, ist es eine funktionale Sprache. Offensichtlich keine reine, aber auch nicht die meisten Sprachen, die wir normalerweise als FP betrachten (z. B. SML). Also wirklich, ich denke du musst dich nur lockern. Wenn das Ihre Augen zucken lässt, müssen Sie einen Arzt aufsuchen.
Jalf
3
@ Jalf, absolut. Die Motivation für die Frage war, dass ich wissen wollte, was meine Kollegen und Leute, die schlauer sind als ich, denken.
Hvgotcodes

Antworten:

180

Ich wiederhole meine eigene Antwort auf eine ähnliche Frage.

Es gibt keine akzeptierte Definition der funktionalen Programmiersprache.

Wenn Sie funktionale Sprache als die Sprache definieren, die erstklassige Funktionen und Lambdas unterstützt, dann ist JavaScript * eine funktionale Sprache.

Wenn Sie auch Faktoren wie die Unterstützung der Unveränderlichkeit, algebraische Datentypen, Mustervergleich, Teilanwendung usw. berücksichtigen, ist JavaScript * keine * funktionale Sprache.


Ich möchte Sie ermutigen, die folgenden verwandten Blog-Beiträge (und auch die Kommentare darunter) zu lesen:

fehlender Faktor
quelle
29
+1 für den Hinweis, dass es keine universelle Definition gibt und einige Beispiele für archetypische funktionale Sprachmerkmale, die JS nicht hat.
1
Spätere Versionen von Mozillas Implementierung von JavaScript (mit 1.7) haben Mustervergleich in Form von Destrukturierungszuweisungen: developer.mozilla.org/en/New_in_JavaScript_1.7#section_20
jbeard4
JavaScript hat den Begriff der Teilweise und der teilweisen Anwendung von Parametern. Ich frage mich daher, ob Ihre Aussage, dass dies nicht unterstützt wird, falsch ist.
Johnbakers
2
@OpenLearner, Teilanwendung wird von so ziemlich jeder Sprache unterstützt, die mir einfällt, sogar C. Für eine bestimmte Definition von "Unterstützung" sowieso. Der Fall mit JS ist nicht anders. Der Punkt ist, ob eine teilweise Anwendung mühelos und in dieser Sprache erstklassig ist. In JS ist es nicht. Wenn Sie neugierig sind, was ich meine, schauen Sie sich OCaml oder Haskell an.
fehlender Faktor
JavaScript unterstützt Unveränderlichkeit afaik.
fka
26

Ich würde sagen, dass es eine Multi-Paradigmen-Sprache ist.

EDIT: Es ist Multi-Paradigma und enthält funktionale Konstrukte.

Niki Yoshiuchi
quelle
Ja, ich stimme zu, es ist eine Mischung und verschiedene Dinge.
Ashley Grenon
5
aber das beantwortet nicht die Frage, ob es auch funktionsfähig ist. Multi-Paradigma zu sein bedeutet, mehrere Paradigmen zu unterstützen. Ist eines dieser Paradigmen funktionale Programmierung?
Jalf
15

Wenn Sie den Begriff "funktionale Programmierung" bis zu philosophischen Diskussionen strecken und verdrehen, ist diese Frage möglicherweise wieder offen. Dann landen Sie jedoch auf der Ebene nützlicher Fragen wie "Ist C ++ wirklich eine Programmiersprache"?

Die Antwort auf Ihre Frage auf mehr täglicher Ebene lautet "Nein" .

Funktionale Programmierung bedeutet, dass das Programm eher als Bewertung einer Funktion als als Kontrollfluss konzipiert ist. Der Code ist eine Beschreibung von Funktionen und hat kein inhärentes Konzept eines Kontrollflusses.

JavaScript hat einen Kontrollfluss und ist als zwingende Sprache konzipiert. Von seinem Entwurfsziel her ist es eindeutig keine funktionale Sprache.

Shuhalo
quelle
1
Designziel? Was meinst du? Zuletzt habe ich nachgesehen, eine der Inspirationsquellen war Scheme. Ich würde sagen, es ist ziemlich klar, dass eines seiner Designziele darin bestand, die funktionale Programmierung zu unterstützen sowie eine Menge anderer Paradigmen zu unterstützen
Jalf
2
Es unterstützt die funktionale Programmierung genauso wie C ++, wenn Sie selbst geeignete Grundlagen dafür schreiben - so viel wie Sie mit ein wenig Arbeit die imperative Syntax beispielsweise in Haskell emulieren können. Die Syntax von JavaScript führt jedoch dazu, dass eher an einen Workflow als an die Bewertung einer Funktion gedacht wird. Aus diesem Grund halte ich (oder die meisten funktionalen Programmierer) die Anwendung des Begriffs "funktional" für zu umfangreich.
Shuhalo
@ user411768: Sie sagen also, ob eine Sprache funktionsfähig ist oder nicht, hängt vom Design ihrer Standardbibliothek ab? Ich habe diese Definition noch nie gehört . Java verfügt über die meisten Tools, die zum Programmieren in einem funktionalen Stil erforderlich sind (z. B. Schließungen und anonyme Funktionen), was C ++ (derzeit) nicht tut. Ich denke, das macht JS viel mehr FP als C ++. Die Tatsache, dass die Sprache Sie nicht zwingt , in einem FP-Stil zu programmieren, macht sie nicht "weniger funktional", oder?
Jalf
1
(i) Die Standardbibliothek ist ebenso wie die syntaktischen Merkmale Teil des Standards und betont einen bestimmten idiomatischen und konzeptuellen Stil. ZB unterscheidet sich "C ++ mit STL" stark von "C mit Klassen". Es hat Auswirkungen. (ii) JavaScript-Merkmale Objektorientierung, erstklassige Bürgerfunktionen - die Merkmale sind eher orthogonal zur imperativ / funktionalen Dichotomie. Es implementiert jedoch weder direkt Currying, noch liefert es Reinheit, noch war es jemals dafür vorgesehen. (iii) Meine letzten Worte dazu finden Sie im ersten Absatz des Beitrags.
Shuhalo
3
Die Aussage, dass JavaScript und C ++ die gleichen funktionalen Programmiermöglichkeiten bieten, ist sicherlich falsch. JavaScript macht die funktionale Programmierung ganz einfach und unkompliziert, ohne all die chaotischen Konstrukte, die Sie in C ++ durchlaufen müssen, um dasselbe zu erreichen. Es gibt viele großartige C ++ - Codierer, die prominent sagen, dass funktionale Programmierung in C ++ wirklich nicht
empfohlen wird
9

Der Begriff "funktionale Programmiersprache" ist heutzutage so überladen, dass er fast unbrauchbar ist. Es gibt zwei dominante Bedeutungen:

  1. Hat erstklassige Funktionen
    • Javascript ist das!
  2. Basiert auf Funktionen, wie sie im Lambda-Kalkül verwendet werden, wobei der Schwerpunkt auf der Vermeidung eines dauerhaften veränderlichen Zustands liegt (häufig durch Ersetzen von Parametern, die an Funktionen übergeben werden).
    • Wie allgemein geschrieben, ist Javascript dies nicht aus der Ferne!

Wählen Sie Ihre Bedeutung und dann ist die Frage beantwortbar.

Futter
quelle
Gibt es eine Quelle, die "funktionale Programmierung" verwendet, um auf Sprachen mit Funktionen zu verweisen, die Bürger erster Ordnung sind?
Shuhalo
@ user411768: Eigentlich ein anderer Antwortender, der mit dem Artikel von Wikipedia verlinkt ist und diese Definition verwendet. en.wikipedia.org/wiki/Javascript - Joel Spolsky hat diese Definition auch in seinem Artikel "Kann Ihre Programmiersprache dies tun?" impliziert. Beitrag über die Vorteile der "funktionalen Programmierung"
Chuck
Sie stellen fest, dass JavaScript, wie allgemein geschrieben, Ihren zweiten Punkt nicht verwendet, aber das bedeutet sicherlich nicht, dass es keine Programmierer gibt, die genau das tun, und dass die Sprache eine solche Funktion nicht unterstützt, weil sie es mit Sicherheit tut
Johnbakers
@OpenLearner: Nun ja, aber das Gleiche gilt für Java und viele andere Sprachen, die allgemein als unbedingt erforderlich angesehen werden. Sie können sie in einem funktionalen Stil schreiben, aber es ist nicht der glückliche Weg der Sprache.
Chuck
... aber das neueste JS würde es unterstützen.
Erik Reppen
3

Ich glaube nicht, dass es eine konkrete Definition der funktionalen Programmierung gibt, aber viele Dinge, die Leute als "funktionale Programmierung" betrachten, können mit Javascript durchgeführt werden. Hier ist ein gutes kurzes Beispiel in diesem Artikel.

Marknery
quelle
2

Für mich ist Javascript sowohl eine zwingende als auch eine funktionale Sprache, und Sie können wählen, ob Sie es in beide Richtungen und sogar ( egad ) in beide Richtungen verwenden möchten . Oder Sie können ein Paradigma verwenden und niemals das andere berühren. Es liegt an dir. Ich denke nicht, dass Javascript wie Sie als funktionale Sprache bezeichnet werden sollte, da es Ihnen ermöglicht, in das Paradigma der funktionalen Programmierung hinein- und herauszuwandern. Wenn es ein Pragma hätte, Sie nur mit funktionalen Programmierparadigmen einzuschränken, wäre das vielleicht nützlich, denke ich. Zusammenfassend sage ich jedoch, dass es sich eher um eine imperative / prozedurale Sprache handelt, in die einige funktionale Programmierfunktionen integriert sind.

Brian Onn
quelle
Aus diesem Grund kann F # nicht mehr als funktional bezeichnet werden.
Eric Mickelsen
1
Richtig. Laut Wikipedia ist F # genau das, was ich gerade als Javascript bezeichnet habe: "F # [...] ist eine [...] Multi-Paradigma-Programmiersprache, die sowohl funktionale Programmierung als auch zwingende objektorientierte Programmierdisziplinen umfasst"
Brian Onn
2

Ich neige dazu, Programmiersprachen nicht als ein bestimmtes Paradigma zu betrachten, sondern als geeignet für bestimmte Paradigmen. Nur weil sie sich für ein bestimmtes Paradigma eignen, heißt das nicht, dass Sie dieses Paradigma verwenden müssen. Es ist durchaus möglich, objektorientierte Programme in C und imperative Programme in ML zu schreiben. Wenn Sie ein bestimmtes Paradigma nicht verwenden, um ein Problem zu lösen, weil die Sprache nicht dafür ausgelegt ist, beschränken Sie sich nur künstlich (natürlich sollten Sie die Einschränkungen einer Sprache immer noch berücksichtigen, wenn Sie entscheiden, ob eine bestimmte Lösung eine gute Lösung ist).

David Brown
quelle
0

Nun, ich würde nicht sagen, dass es funktionale Programmierung ist, aber dann würde ich sagen, dass es objektorientiert ist und erst heute sagte ein Freund, er würde es auch nicht in dieses Regal stellen.

Also, obwohl ich es nicht sagen würde, gibt es wohl Raum für Meinungen. Es hat klassische Merkmale der funktionalen Programmierung, es hat keine anderen.

Slezica
quelle
2
JavaScript ist objektorientiert. OO benötigt keine Klassen, jedoch Objekte.
Inkognito
3
Javascript ist nicht objektorientiert, sondern prototypbasiert.
Kris
1
JavaScript programmiert Suppe. Ein bisschen davon und ein bisschen davon.
Andrew S
0

Javascript ist bis zu einem gewissen Punkt. Es hängt wirklich davon ab, wie Sie es programmieren. Wenn ich auf OO-Weise codiere, wäre es nicht OO? Wenn Sie also Dinge nur auf "funktionale" Weise codieren, wäre dies funktional. Ich denke, es ist eine Multi-Paradigmen-Sprache, also ist es nicht ganz richtig, sie nur eines zu nennen.


quelle
0

@petraszd Ich schreibe Ihren Code ein wenig um, um ein "neues" für den Operator zu erhalten:

   
   function ffor(a, b, f){
     function it(i){
       if(i > b)return
       f(i)
       it(i+1)
     }
     it(a)
   }

   print("----" + new Date()+"----")

   var funcs = []
   ffor(0, 9, function(i){
     funcs.push(function(){return i})
   })

   ffor(0, 9, function(i){
     print(funcs[i]())
   })

Aber ich weiß, dass dieser Weg Nachteile für große Schleifen hat ...

Verwandte Frage zur Optimierung der Schwanzrekurtion in JS

PS Hier gepostet, weil es Probleme mit der Code-Formatierung beim Posten als Kommentar gibt

Aeracode
quelle
0

In Javascript können Sie so etwas tun !!

// Data
var fruits = [
    { name: 'apple',  price: 5 }, 
    { name: 'orange', price: 10 }, 
    { name: 'lemon',  price: 15 }
]

// Request Data from magicURL
request('magicURL')
    .then(selectKeyOf('price'))
    .then(priceMethod('sum'))
    .then((result)=>{
        console.log(result) // 30
    })

Ich habe eine Github-Seite erstellt, um dieses Konzept zu demonstrieren, und Sie können meine Implementierung klonen / anzeigen

Wayne Chiu
quelle
0

Wie wir wissen, erlaubt die funktionale Programmiersprache nicht, die Elemente (den Zustand) von Funktionen zu ändern oder zu mutieren, aber in Javascript ist es in diesem Sinne erlaubt, dass es keine funktionale Programmiersprache ist, obwohl sie die Funktion als Bürger erster Klasse behandelt.

Sourabh Ranka
quelle
-2

Was ich in Javascript wirklich hasse (wenn Sie versuchen, es als FP-Sprache zu betrachten), ist Folgendes:

function getTenFunctionsBad() {
  var result = [];
  for (var i = 0; i < 10; ++i) {
    result.push(function () {
      return i;
    });
  }
  return result;
}

function getTenFunctions() {
  var result = [];
  for (var i = 0; i < 10; ++i) {
    result.push((function (i) {
      return function () {
        return i;
      }
    })(i));
  }
  return result;
}

var functionsBad = getTenFunctionsBad();
var functions = getTenFunctions()
for (var i = 0; i < 10; ++i) {
  // using rhino print
  print(functionsBad[i]() + ', ' + functions[i]());
}

// Output:
//   10, 0
//   10, 1
//   10, 2
//   10, 3
//   10, 4
//   10, 5
//   10, 6
//   10, 7
//   10, 8
//   10, 9

Sie müssen die JS-Stack-Umgebung verstehen (ich weiß nicht, ob es der richtige Begriff ist), um ein solches Verhalten zu verstehen.

Im Schema zum Beispiel können Sie so etwas einfach nicht produzieren (Ok, ok - mit Hilfe der Referenzen der zugrunde liegenden Sprachen können Sie es machen):

(define (make-ten-functions)
  (define (iter i)
    (cond ((> i 9) '())
          (else (cons (lambda () i) (iter (+ i 1))))))
  (iter 0))

(for-each (lambda (f)
            (display (f))
            (newline)) (make-ten-functions))
petraszd
quelle
1
Hm, ich denke, Javascript enthält Verweise auf Variablen, aber keine Verweise auf Werte .
Aeracode
1
Das Verständnis des variablen Umfangs ist entscheidend für eine effektive Programmierung in jeder Sprache. Javascript ist damit nicht allein.
Rich Remer