Für welche häufigen Probleme ist funktionale Programmierung nicht geeignet? [geschlossen]

22

Funktionale Programmierung ist ein deklaratives Paradigma. Eine der Stärken von FP ist, dass Nebenwirkungen vermieden werden. Es wird gesagt, dass für einige Probleme FP nicht gut passt.

Für welche häufigen Probleme ist funktionale Programmierung nicht geeignet?

Jonas
quelle
Wütend! Für einen Moment dachte ich, Sie sagten "ist ein defektes Paradigma". Dann kam ich zurück und überprüfte.
Mark C
1
Ich denke, es ist genauer zu sagen, dass Nebenwirkungen isoliert (in Haskell jedenfalls) als vermieden werden. Monaden erlauben Zustandsänderungen und man nennt sie sogar "State".
Larry Coleman
Wie Larry Coleman erklärte, ist es nicht wahr, dass funktionale Programmierung Nebenwirkungen vermeidet, sondern dass sie ihre Verwendung behindert und sie in einigen Sprachen eindeutig isoliert. Lesen Sie z. B. Abschnitt 7 von research.microsoft.com/en-us/um/people/simonpj/papers/…
Giorgio,

Antworten:

17

Bewerbungen, die sehr zustandsorientiert sind. Videospiele sind ein gutes Beispiel, da sie die reale Welt abbilden. Es ist viel sinnvoller, daran zu denken, den Zustand der Welt zu ändern, anstatt jedes Mal, wenn sich etwas ändert, den vorherigen Zustand wiederherzustellen.

Ein konkretes Beispiel wäre, die Gesundheit eines Monsters zu verändern, nachdem es erschossen wurde. Es ist viel sinnvoller, einfach seine Gesundheit zu ändern, als es durch ein völlig neues Monster zu ersetzen, das in jeder Hinsicht gleich ist, außer dass es jetzt weniger Gesundheit hat. Diese Art von Änderungen macht fast alles in einer Spielwelt aus, und dies auf rein funktionale Weise zu tun, ist nicht sehr intuitiv. Ich stelle mir vor, dass es zu erheblichen Performance-Einbußen kommen kann, zumindest wenn Sie dies in einer rein funktionalen Sprache tun.

(Nebenbei bemerkt, einige Probleme in Spielen eignen sich sehr gut für die funktionale Programmierung, wie z. B. KI. Eine hybride funktionale / imperative Sprache wäre in diesen Fällen eine hervorragende Lösung.)

Matt Olenik
quelle
9
Der Artikel The Next Mainstream Programming Languages: Die Perspektive eines Spieleentwicklers spricht sich für ein pl aus, insbesondere für die Spieleentwicklung, bei der das rein funktionale Verhalten die Standardeinstellung ist und die Statusänderung anhand von Typen verfolgt wird, um Fehler zu vermeiden. Daher glauben nicht alle, dass das Funktionsparadigma für die Programmierung von Spielen von Natur aus ungeeignet ist.
16.
1
@sepp2k, danke für den Link. Ich bin froh, dass die Perspektive von jemandem diskutiert wird, der echte Spiele gemacht hat.
Matt Olenik
3
@ sepp2k warte, hab ich was verpasst? Nach einer genaueren Lektüre der Präsentation scheint Sweeney dafür zu plädieren, dass der größte Teil der Core-Engine mit rein funktionalem Code geschrieben wird und der größte Teil der Spielelogik zwingend (oder zumindest zulässig) geschrieben wird und STM zur Unterstützung der Parallelität verwendet wird . Das erscheint mir sehr vernünftig.
Matt Olenik
@Matt: Nein, du hast recht, er sagt, dass der Spielelogik-Teil einen veränderlichen Zustand enthalten wird. Dies schließt jedoch nicht aus, dass die Sprache die Veränderbarkeit anhand von Typen nachverfolgt (was er im Abschnitt "Überlegungen" vorschlägt). Natürlich ist "Tracking-Status durch Typen" nicht gleich "funktional", daher hätte ich meinen vorherigen Kommentar möglicherweise etwas zu optimistisch formuliert.
16.
@sepp2k richtig, ich verstehe was du meinst.
Matt Olenik
17

Bei der eingebetteten Echtzeitprogrammierung dreht sich alles um die Nebenwirkungen. Bei der Interaktion mit digitalen und analogen E / A-Anschlüssen, Timern, seriellen und parallelen Anschlüssen werden alle interessanten Funktionen mit Nebenwirkungen aufgerufen.

Ahelly
quelle
3
Nun, wenn Sie nur die Hardware-Schnittstelle meinen, bezweifle ich, dass etwas anderes als C / C ++ eine gute Wahl ist. Auf dieser Ebene werden jedoch manchmal Sprachen wie Erlang verwendet, insbesondere in Telekommunikationssystemen. Erlang ist eine funktionale Sprache, die für kritische und fehlertolerante eingebettete Echtzeitsysteme entwickelt wurde.
Jonas
@Jonas: Erlang kann die Mutation minimieren, hängt jedoch stark von IO ab, um Nachrichten weiterzuleiten. Dies ist natürlich ein Nebeneffekt.
Jon Harrop
11

Ich würde argumentieren, dass die GUI-Programmierung nicht gut für die funktionale Programmierung geeignet ist. GUIs sind im Allgemeinen sehr stateful und es ist viel einfacher, sie mit state zu modellieren / zu verwalten, als ohne Nebeneffekte. Es ist sicherlich möglich , eine funktionierende Programmiersprache für GUIs zu verwenden ... aber es ist wahrscheinlich keine gute Idee.

Wie in einer anderen Antwort erwähnt, lassen sich Spiele häufig einfacher verwalten, indem der Status verfolgt wird. Sie können ein Spiel zwar in einer funktionalen Sprache schreiben, dies ist jedoch häufig einfacher und effizienter in einer "stateful" -Sprache (dh objektorientiert) Sprache).

mipadi
quelle
-1: Sie sprechen von Reinheit und ignorieren die Verwendung erstklassiger Funktionen, z. B. sind Rückrufe im GUI-Code mit unreinen FP-Sprachen viel einfacher als mit OOP-Sprachen.
Jon Harrop
4
@ Jon Harrop: Erstklassige Funktionen gibt es nicht nur in funktionalen Programmiersprachen. Ich behaupte immer noch, dass der FP-Stil nicht gut für GUIs geeignet ist.
Mipadi
1
Kommt drauf an wen du fragst. Für die meisten funktionalen Programmierer sind erstklassige Funktionen die eigentliche Definition der funktionalen Programmierung.
Jon Harrop
@ Jon Harrop: Die meisten funktionalen Programmierer würden sagen, dass funktionale Programmierung eine Methode zur Beschreibung von Programmen als Zusammensetzung und Bewertung mathematischer Funktionen ist. Erstklassige Funktionen sind ein wichtiger Teil dieses Paradigmas, aber erstklassige Funktionen allein machen keine funktionale Programmiersprache (oder ein funktionales Programm) aus. Das funktionale Programmierparadigma zielt darauf ab, die Verwendung von Zustands- und veränderlichen Datenstrukturen zu minimieren, und selbst unreine FP-Sprachen fördern diesen Stil. Bei FP geht es ebenso um einen Programmierstil wie um einzelne Features wie erstklassige Funktionen und ...
mipadi
... Ich finde nicht, dass dieses Paradigma besonders für die GUI-Programmierung geeignet ist - objektorientierte Sprachen sind im Allgemeinen besser für GUIs geeignet.
Mipadi
5

Datengetriebene Geschäftsanwendungen. Benutzeroberfläche und einfache Datenoperationen benötigen kein FP.

Branimir
quelle
2
Und wirklich jede andere Daten- / Ansichtsanwendung. Bei den meisten Spielen geht es um Zustand und Veränderung. Daher ist die Übersetzung in einen funktionalen Stil nicht gut.
Jon Purdy
18
"Ja wirklich?" Ich habe immer gedacht, dass FP dafür besonders gut ist . Wie 99% von dem, was diese Apps tun, um Daten auszuwählen, zu aggregieren und zu projizieren? Das ist im Grunde filter, reduceund map. Werfen Sie in ein paar sort, partition, groupBy. Schließlich ist die am weitesten verbreitete Programmiersprache , wie Anwendungen für das Schreiben von Excel, das ist eine funktionale Sprache.
Jörg W Mittag
3
Datengetriebene Geschäftsanwendungen und Anwendungen mit einfachen Datenoperationen passen sehr gut zu FP, und ich habe gehört, dass FP für solche Dinge beliebt ist. Siehe z. B. Adventures als funktionaler Programmierer an der Wall Street
Jonas
1
-1: Sie haben eine Anwendung aufgelistet, bei der sich FP auszeichnet.
Jon Harrop
2

Sie können ein Problem, das für die eigentliche funktionale Programmierung nicht geeignet ist, nicht einfach ausschließen.

Viel hängt von der tatsächlichen Sprache ab, die für die funktionale Programmierung und deren Funktionen verwendet wird.

Ein Beispiel ist das bereits erwähnte Erlang für eingebettete Echtzeitsysteme.

Zustandsfülle ist auch kein gutes Kriterium gegen funktionale Programmierung, es gibt mehrere erfolgreiche Wege, um mit funktionalen Programmiersprachen umzugehen.

Nebenwirkungen werden auch häufig gegen funktionale Programmierung erwähnt. Jedes Programm, das nicht ganz solipsistisch ist, hat Nebenwirkungen. Daher hat jede reale FP-Sprache eine Möglichkeit, damit umzugehen. Es ist nur eine Frage, wie elegant die Nebenwirkungen der Welt zusammengefasst werden können.

Willkürliche Nebenwirkungen wie globale Variablen sind überhaupt nicht erforderlich.

Es gibt jedoch Problemgruppen, die den Einstieg in die funktionale Programmierung erleichtern, da sie Ihre gewohnte Sichtweise auf das Problem nicht so stark verdrehen. Aber wenn Sie erst einmal davon überzeugt sind, dass mehr und mehr Problemstellungen für weniger Nebenwirkungen offen sind.

Auch bei der Programmierung von C ist es immer eine gute Idee, beliebige Nebenwirkungen wie globale Variablen so weit wie möglich zu reduzieren.

Peer Stritzinger
quelle
State-Ful-Anwendungen wie GUI-Anwendungen sind in funktionaler Hinsicht schwer zu realisieren, oder haben Sie Empfehlungen?
Jonas
Wenn Sie eine Art Prozess- / Thread-Abstraktion haben (z. B. in Erlang), können Sie Ihren Status in einem Prozess weitergeben.
Peer Stritzinger
3
GUI-Anwendungen werden normalerweise um eine Ereignisschleife erstellt. Sie können eine Ereignisschleife ziemlich gut in einer funktionalen Sprache schreiben. Wenn es komplizierter ist, werden Sie wahrscheinlich einige Threads / Prozesse für die Hintergrundverarbeitung hinzufügen. Wenn Sie jedoch eine Art Prozess- / Thread-Abstraktion haben (z. B. in Erlang), können Sie Ihren Status problemlos in einem Prozess weitergeben. Fortsetzungen könnten sich auch als nützlich erweisen. Ich denke, es ist nur gewöhnungsbedürftig, Dinge auf funktionale Weise zu erledigen, um sogar die GUIs in den Griff zu bekommen. Ein Grund, warum die GUI-Programmierung heutzutage als schwierig angesehen wird, ist, dass die meisten Toolkits nicht für den funktionalen Gebrauch gedacht sind.
Peer Stritzinger
1
@ Jonas: In Haskell würden Sie entweder die IO-Monade, die State-Monade oder eine Kombination verwenden.
Larry Coleman
1
@Jonas: das kommt auf deine definition von nützlich an. Das Wikibook-Beispiel verwendet wxHaskell, während Real World Haskell gtk2hs verwendet. Ich habe es auch nicht versucht, da meine Haskell-App auf der Befehlszeile basiert.
Larry Coleman