Was sind die Vorteile der funktionalen Programmierung? [geschlossen]

95

Was sind Ihrer Meinung nach die Vorteile der funktionalen Programmierung? Und wie gelten sie heute für Programmierer?

Was sind die größten Unterschiede zwischen funktionaler Programmierung und OOP?

Rayne
quelle
5
Das Blub-Paradoxon. paulgraham.com/avg.html
fehlender Faktor

Antworten:

75

Der Stil der funktionalen Programmierung besteht darin, zu beschreiben, was Sie wollen, und nicht, wie Sie es bekommen. Das heißt: Anstatt eine for-Schleife mit einer Iteratorvariablen zu erstellen und durch ein Array zu marschieren, das etwas mit jeder Zelle tut, würde man sagen, dass das Äquivalent von "Diese Bezeichnung bezieht sich auf eine Version dieses Arrays, in der diese Funktion für alle ausgeführt wurde Elemente. "

Durch funktionale Programmierung werden grundlegendere Programmierideen in den Compiler verschoben, z. B. Listenverständnis und Caching.

Der größte Vorteil der funktionalen Programmierung ist die Kürze, da der Code präziser sein kann. Ein Funktionsprogramm erstellt keine Iteratorvariable als Zentrum einer Schleife, sodass dieser und andere Arten von Overhead aus Ihrem Code entfernt werden.

Der andere große Vorteil ist die Parallelität, die mit der funktionalen Programmierung einfacher zu bewerkstelligen ist, da der Compiler die meisten Vorgänge erledigt, bei denen früher Statusvariablen manuell eingerichtet werden mussten (wie der Iterator in einer Schleife).

Abhängig von der Art und Weise, wie das Programm geschrieben wird, können einige Leistungsvorteile auch im Kontext eines einzelnen Prozessors gesehen werden, da die meisten funktionalen Sprachen und Erweiterungen eine verzögerte Auswertung unterstützen. In Haskell können Sie sagen "Diese Bezeichnung repräsentiert ein Array, das alle geraden Zahlen enthält". Ein solches Array ist unendlich groß, aber Sie können jederzeit nach dem 100.000sten Element dieses Arrays fragen, ohne zum Zeitpunkt der Array-Initialisierung wissen zu müssen, welchen Wert Sie am meisten benötigen. Der Wert wird nur berechnet, wenn Sie ihn benötigen, und nicht weiter.

Chris Wenham
quelle
12
Ich bin der Meinung, dass Ihr erster Absatz der Beschreibung deklarativer relationaler Programmierung wie Prolog näher kommt als der funktionalen Programmierung.
McPherrinM
6
@McPherrinM: Funktionssprachen sind deklarativ und nicht zwingend.
Lie Ryan
2
Scheint, als würden Sie DP vs. IP mit prozedural vs. FP verwechseln . FP sorgt für die Trennung von Bedenken, indem die Funktionszusammensetzung betont wird, dh die Abhängigkeiten zwischen den Teilberechnungen einer deterministischen Berechnung getrennt werden.
Shelby Moore III
2
@LieRyan falsch. Bitte sehen Sie den Link in meinem vorherigen Kommentar
Shelby Moore III
Parallelität besteht aus mehreren Threads, die miteinander interagieren können, was unbedingt erforderlich ist. Das gleichzeitige Ausführen mehrerer unabhängiger Berechnungen wird als Parallelität bezeichnet . Siehe en.wikipedia.org/wiki/Concurrency_(computer_science)
Lambda Fairy
29

Der größte Vorteil ist, dass es nicht das ist, was Sie gewohnt sind. Wählen Sie eine Sprache wie Scheme und lernen Sie, Probleme damit zu lösen, und Sie werden ein besserer Programmierer in Sprachen, die Sie bereits kennen. Es ist wie eine zweite menschliche Sprache zu lernen. Sie gehen davon aus, dass andere im Grunde genommen eine Variation für sich sind, weil Sie nichts zu vergleichen haben. Der Kontakt mit anderen, insbesondere mit Personen, die nichts mit dem zu tun haben, was Sie bereits wissen, ist aufschlussreich.

Kirk Strauser
quelle
28
Das ist ein Vorteil des Lernens, kein Vorteil des Paradigmas selbst
Moe
2
Aber sind sie wirklich getrennt? Vom Standpunkt des ursprünglichen Fragestellers würde ich nicht sagen - sie suchen höchstwahrscheinlich nach Vorteilen, wenn sie sich insgesamt um das Erlernen einer funktionalen Sprache bemühen.
Kendall Helmstetter Gelner
3
"Das ist ein Vorteil des Lernens, kein Vorteil des Paradigmas selbst". Das Paradigma wird in Ihre andere OOP-Arbeit einfließen und kann dazu beitragen, Ihre Entwicklung dort zu vereinfachen. Sie können Probleme mit einem "Berechnen dieser Ausgabe von dieser Eingabe" und "Zusammenstellen dieser beiden Funktionen, die neue Daten berechnen" anstelle von "Warten - wie war der Status einer gemeinsam genutzten Variablen dort drüben?" und "Habe ich diese Prozeduren in der richtigen Reihenfolge ausführen lassen?". Im Ernst, Sie erhalten diese Vorteile (aus dem Verständnis des FP-Paradigmas) in Python, C #, C ++, Java, wie Sie es nennen.
Jared Updike
11

Warum funktionale Programmierung wichtig ist
http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf

Abstrakt

Da Software immer komplexer wird, wird es immer wichtiger, sie gut zu strukturieren. Gut strukturierte Software ist einfach zu schreiben und zu debuggen und bietet eine Sammlung von Modulen, die wiederverwendet werden können, um zukünftige Programmierkosten zu senken.

In diesem Artikel zeigen wir, dass insbesondere zwei Merkmale funktionaler Sprachen, Funktionen höherer Ordnung und eine verzögerte Bewertung, erheblich zur Modularität beitragen können. Als Beispiele manipulieren wir Listen und Bäume, programmieren mehrere numerische Algorithmen und implementieren die Alpha-Beta-Heuristik (ein Algorithmus aus künstlicher Intelligenz, der in Spielprogrammen verwendet wird). Wir schließen daraus, dass die funktionale Programmierung wichtige Vorteile für die Softwareentwicklung bietet, da Modularität der Schlüssel für eine erfolgreiche Programmierung ist.

Robert Harvey
quelle
10

Ein guter Ausgangspunkt wäre daher, zu versuchen, einige Dinge zu verstehen, die in imperativen Sprachen nicht möglich sind, aber in funktionalen Sprachen möglich sind.

Wenn Sie über Berechenbarkeit sprechen, gibt es natürlich nichts, was in der funktionalen, aber nicht zwingenden Programmierung möglich ist (oder umgekehrt).

Bei verschiedenen Programmierparadigmen geht es nicht darum, Dinge zu ermöglichen, die vorher nicht möglich waren, sondern darum, Dinge zu vereinfachen, die vorher schwierig waren.

Mit der funktionalen Programmierung können Sie Programme, die präzise, ​​fehlerfrei und parallelisierbar sind, einfacher schreiben.

sepp2k
quelle
5

Es muss nicht das eine oder andere sein: Mit einer Sprache wie C # 3.0 können Sie die besten Elemente von jedem mischen. OO kann für die Struktur im großen Maßstab auf Klassenebene und darüber verwendet werden. Funktionsstil für die Struktur im kleinen Maßstab auf Methodenebene.

Durch die Verwendung des Funktionsstils kann Code geschrieben werden, der seine Absicht klar erklärt, ohne mit Kontrollflussanweisungen usw. verwechselt zu werden. Aufgrund der Prinzipien wie der nebenwirkungsfreien Programmierung ist es viel einfacher, über Code nachzudenken und seine Richtigkeit zu überprüfen .

Samuel Jack
quelle
5

Ich denke, das praktischste Beispiel für die Notwendigkeit einer funktionalen Programmierung ist die Parallelität - funktionale Programme sind natürlich threadsicher, und angesichts des Aufstiegs der Multi-Core-Hardware ist dies von äußerster Wichtigkeit.

Die funktionale Programmierung erhöht auch die Modularität - Sie können häufig Methoden / Funktionen im Imperativ sehen, die viel zu lang sind - Sie werden fast nie eine Funktion sehen, die länger als ein paar Zeilen ist. Und da alles entkoppelt ist, wird die Wiederverwendbarkeit erheblich verbessert und das Testen von Einheiten ist sehr, sehr einfach.

Bozhidar Batsov
quelle
3

Sobald das Programm wächst, wird die Anzahl der Befehle in unserem Wortschatz zu hoch, was die Verwendung sehr schwierig macht. Hier erleichtert die objektorientierte Programmierung unser Leben, da wir unsere Befehle besser organisieren können. Wir können alle Befehle, an denen der Kunde beteiligt ist, einer Kundenentität (einer Klasse) zuordnen, wodurch die Beschreibung viel klarer wird. Das Programm ist jedoch immer noch eine Folge von Befehlen, die angeben, wie es fortfahren soll.

Die funktionale Programmierung bietet eine völlig andere Möglichkeit, den Wortschatz zu erweitern. Nicht beschränkt auf das Hinzufügen neuer primitiver Befehle; Wir können auch neue Kontrollstrukturen hinzufügen - Grundelemente, die angeben, wie Befehle zum Erstellen eines Programms zusammengestellt werden können. In imperativen Sprachen konnten wir Befehle in einer Sequenz oder mit einer begrenzten Anzahl integrierter Konstrukte wie Schleifen erstellen. Wenn Sie sich jedoch typische Programme ansehen, werden Sie immer noch viele wiederkehrende Strukturen sehen. gängige Methoden zum Kombinieren von Befehlen

Soner Gönül
quelle
1

Denken Sie nicht an funktionale Programmierung im Sinne eines "Bedarfs". Stellen Sie sich das stattdessen als eine andere Programmiertechnik vor, die Ihren Geist öffnet, genau wie OOP, Vorlagen, Assemblersprache usw. Ihre Denkweise möglicherweise völlig verändert haben, als Sie sie gelernt haben. Wenn Sie funktionale Programmierung lernen, werden Sie letztendlich zu einem besseren Programmierer.

Justin Ethier
quelle
0

Wenn Sie die funktionale Programmierung noch nicht kennen, erhalten Sie durch das Lernen mehr Möglichkeiten, Probleme zu lösen.

FP ist eine einfache Verallgemeinerung, die Funktionen zu erstklassigen Werten befördert, während OOP für die umfassende Strukturierung von Code vorgesehen ist. Es gibt jedoch einige Überschneidungen, bei denen OOP-Entwurfsmuster mit erstklassigen Funktionen direkt und viel prägnanter dargestellt werden können.

Viele Sprachen bieten sowohl FP als auch OOP, einschließlich OCaml, C # 3.0 und F #.

Prost, Jon Harrop.

JD
quelle