332 Stimmen

Warum eignet sich Python nicht besonders gut für die funktionale Programmierung?

Ich habe immer gedacht, dass funktionale Programmierung in Python möglich ist. Daher war ich erstaunt, dass Python in den folgenden Artikeln nicht besonders erwähnt wurde este Frage, und wenn es erwähnt wurde, war es normalerweise nicht sehr positiv. Allerdings wurden nicht viele Gründe dafür genannt (fehlende Mustererkennung und algebraische Datentypen wurden erwähnt). Meine Frage lautet also: Warum ist Python nicht sehr gut für die funktionale Programmierung geeignet? Gibt es mehr Gründe als das Fehlen von Mustererkennung und algebraischen Datentypen? Oder sind diese Konzepte so wichtig für die funktionale Programmierung, dass eine Sprache, die sie nicht unterstützt, nur als zweitklassige funktionale Programmiersprache eingestuft werden kann? (Bedenken Sie, dass meine Erfahrung mit funktionaler Programmierung recht begrenzt ist).

15voto

xeno Punkte 372

Eine Sache, die für diese Frage (und die Antworten) wirklich wichtig ist, ist die folgende: Was zur Hölle ist funktionale Programmierung und was sind die wichtigsten Eigenschaften davon. Ich werde versuchen, meine Sicht der Dinge darzulegen:

Funktionales Programmieren ist so ähnlich wie das Schreiben von Mathematik auf einer Tafel. Wenn Sie Gleichungen auf ein Whiteboard schreibt, denkt man nicht über eine Ausführungsreihenfolge nach. Es gibt (normalerweise) keine Mutation. Man kommt nicht am nächsten Tag zurück und schaut sich das Ergebnis an, und wenn man die Berechnungen erneut durchführt, kommt man zu einem anderen Ergebnis (oder vielleicht, wenn man frischen Kaffee getrunken hat :)). Im Grunde genommen, ist das, was auf der Tafel steht, schon da, und die Antwort war schon da, als du angefangen hast Sie haben sie nur noch nicht erkannt.

Bei der funktionalen Programmierung ist es ähnlich: Man ändert nichts, man wertet nur aus die Gleichung (oder in diesem Fall das "Programm") aus und findet heraus, wie die Antwort lautet. Das Programm ist immer noch da, unmodifiziert. Das Gleiche gilt für die Daten.

Ich würde die folgenden Merkmale als die wichtigsten der funktionalen Programmierung einstufen: a) referenzielle Transparenz - wenn man die gleiche Anweisung zu einem anderen Zeitpunkt auswertet und an einem anderen Ort auswertet, aber mit denselben Variablenwerten, wird sie immer noch dasselbe bedeuten. b) keine Nebenwirkung - egal wie lange man auf die Tafel starrt, die Gleichung, die ein anderer die ein anderer an einer anderen Tafel betrachtet, wird sich nicht zufällig ändern. c) Funktionen sind auch Werte, die weitergegeben und mit oder auf andere Variablen angewendet werden können. Variablen. d) Funktionskom äquivalent zum Aufruf von g(f(..)) ist.

Diese Liste ist nach meinen Prioritäten geordnet, so dass die referenzielle Transparenz an erster Stelle steht, gefolgt von "keine Nebenwirkungen".

Nun, wenn Sie durch Python gehen und prüfen, wie gut die Sprache und Bibliotheken unterstützt, und diese Aspekte garantiert - dann sind Sie auf dem besten Weg, Ihre eigene Frage zu beantworten.

9voto

S.Lott Punkte 371691

Python ist fast eine funktionale Sprache. Es ist "functional lite".

Es hat zusätzliche Funktionen, so dass es für manche nicht rein genug ist.

Außerdem fehlen ihm einige Funktionen, so dass es für manche nicht vollständig genug ist.

Die fehlenden Funktionen sind relativ einfach zu schreiben. Sehen Sie sich Beiträge wie este über FP in Python.

9voto

Dvd Avins Punkte 440

Ein weiterer Grund, der oben nicht erwähnt wurde, ist, dass viele eingebaute Funktionen und Methoden von eingebauten Typen ein Objekt verändern, aber das veränderte Objekt nicht zurückgeben. Würden diese geänderten Objekte zurückgegeben, wäre der Funktionscode sauberer und prägnanter. Wenn zum Beispiel some_list.append(some_object) some_list mit angefügtem some_object zurückgeben würde.

5voto

Neben anderen Antworten ist ein Grund dafür, dass Python und die meisten anderen Multi-Paradigmen-Sprachen nicht gut für echte funktionale Programmierung geeignet sind, dass ihre Compiler / virtuellen Maschinen / Laufzeiten keine funktionale Optimierung unterstützen. Diese Art der Optimierung wird dadurch erreicht, dass der Compiler mathematische Regeln versteht. Viele Programmiersprachen unterstützen zum Beispiel eine map Funktion oder Methode. Hierbei handelt es sich um eine Standardfunktion, die eine Funktion als ein Argument und eine Iterable als zweites Argument annimmt und diese Funktion auf jedes Element in der Iterable anwendet.

Wie auch immer, es stellt sich heraus, dass map( foo() , x ) * map( foo(), y ) ist dasselbe wie map( foo(), x * y ) . Der letztere Fall ist tatsächlich schneller als der erste, weil der erste zwei Kopien ausführt, während der zweite nur eine ausführt.

Bessere funktionale Sprachen erkennen diese mathematisch basierten Beziehungen und führen die Optimierung automatisch durch. Sprachen, die nicht auf das funktionale Paradigma ausgerichtet sind, werden wahrscheinlich nicht optimieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X