Wann sollte eine funktionale Programmiersprache verwendet werden?

88

In welchen Situationen sollte ich eine funktionale Programmiersprache anstelle einer ausführlicheren objektorientierten Sprache wie C ++, C # oder Java verwenden?

Ich verstehe, was funktionale Programmierung ist, was ich nicht wirklich verstehe, ist, für welche Arten von Problemen ist es eine perfekte Lösung?

Alex Baranosky
quelle
Diese Frage wird hier beantwortet stackoverflow.com/questions/381685/…
krosenvold
2
Immer. Oder zumindest nie nie.
Shelby Moore III
1
Bei Lambdas ist C # grenzwertig.
JD

Antworten:

49

Funktionale Sprachen eignen sich meiner Meinung nach hauptsächlich für zwei Dinge: Spiel-AIs und mathematische Berechnungen. Es ist gut in Spiel-AIs wegen seiner netten Listenmanipulationen (zumindest in Lisp und Scheme) und für mathematische Berechnungen wegen seiner Syntax. Scheme, Lisp und Haskell haben eine Syntax, mit der mathematische Berechnungen leicht zu lesen sind. Das Letzte, was ich hinzufügen muss, ist, dass funktionale Sprachen wirklich lustige Sprachen sind. Mein Scheme-Kurs war einer der Kurse, mit denen ich am meisten Spaß hatte.

martiert
quelle
2
Nachdem ich über die Tatsache hinweggekommen war, dass mein Gehirn in meiner ersten Woche der Compiler-Klasse, die ich in Scheme absolvierte, explodieren wollte, fand ich es auch sehr lustig (und ich wurde viel besser darin, hehe)
Alex Baranosky
1
Welche funktionalen Sprachen haben Sie für mathematische Berechnungen verwendet?
Jules
8
Auch Compiler! Ich habe gehört, dass Leute, die Compiler in Haskell geschrieben haben, sagen, sie würden "nie wieder einen Compiler in einer zwingenden Sprache schreiben".
ShreevatsaR
1
julesjacobs: Ich habe sowohl Haskell als auch Scheme verwendet, um einfache mathematische Berechnungen zu lösen. Ich bin überhaupt nicht gut in diesen Sprachen, also habe ich einen Weg, um komplexere Probleme zu lösen. Ich kann sie jetzt einfach nicht schnell genug machen.
Martiert
93

Ich habe dies selbst recherchiert und dachte, ich könnte CONCURRENCY zur Liste der Gründe für die Verwendung einer funktionalen Sprache hinzufügen. In naher Zukunft wird die Prozessorgeschwindigkeit mit derselben CPU-Technologie nicht mehr steigen können. Die Physik der Architektur wird es nicht zulassen.

Hier kommt also die gleichzeitige Verarbeitung ins Spiel.

Leider können die meisten OOP-Sprachen aufgrund der gegenseitigen Abhängigkeiten zwischen Daten nicht mehrere Prozessoren gleichzeitig nutzen.

In reinen funktionalen Programmiersprachen kann der Computer zwei (oder viele weitere) Funktionen gleichzeitig ausführen, da diese Funktionen die Informationen außerhalb des Zustands nicht ändern.

Hier ist ein ausgezeichneter Artikel über funktionale Programmierung, den Sie vielleicht genießen werden.

Alex Baranosky
quelle
36
Ich würde nicht sagen, dass die meisten OO-Sprachen eine beliebig große Anzahl von Prozessoren nicht nutzen können. Ich würde sagen, damit ein Programm viele Prozessoren gleichzeitig effizient und zuverlässig nutzen kann, muss dieses Programm so organisiert sein, dass sich die meisten rechenintensiven Codeeinheiten wie reine Funktionen verhalten. Auf diese Weise kann ein Programm in den meisten Sprachen organisiert werden. In funktionalen Sprachen ist dies einfacher als in imperativen (einschließlich objektorientierten) Sprachen.
Zak
2
Vielen Dank, dass Sie diesen Artikel verlinkt haben. Es hat mir wirklich geholfen, die Dinge zu erklären.
Guptron
13

Ein Freund von mir zitierte einen seiner College-Professoren mit folgenden Worten:

Zeichnen Sie ein Raster mit Datentypen oben und Operationen für diese Datentypen unten links. Wenn Sie das Raster vertikal schneiden, führen Sie OO aus. Wenn Sie das Raster horizontal schneiden, machen Sie FP.

Meine Antwort ist, dass FP ein völlig praktikabler Ansatz für die Programmierung mit einem so breiten Anwendungsbereich wie OO ist. Wie bei jeder Diskussion über die Wahl der Programmiersprache denke ich, dass die wichtigeren Fragen sind:

  1. Haben Sie die Zeit, in das Erlernen einer neuen Notation und einer neuen Denkweise zu investieren?
  2. Welche der Sprachen, die Sie in Betracht ziehen, verfügt über ausreichend umfangreiche Bibliotheken, damit Sie nicht daran hängen bleiben, ein Rad neu zu erfinden?

In Bezug auf die erste Frage, wenn Sie dies hauptsächlich für den Lernwert tun, würde ich vorschlagen, sich Haskell anzusehen , da es eine breite Palette an Unterstützungsmaterialien gibt (Bücher, Artikel, aktive Community usw.).

Was die zweite Frage betrifft, hat Haskell eine schöne Auswahl an Bibliotheken (obwohl einige ausgereifter sind als andere), aber Scala (eine hybride OO-funktionale Sprache, die auf der JVM ausgeführt wird) hat die Vorteile, dass Sie schrittweise in den funktionalen Stil übergehen können , und Ihnen steht die gesamte Palette der für Java zugänglichen Bibliotheken zur Verfügung.

joel.neely
quelle
Ich habe Scheme im College gelernt, deshalb möchte ich funktionale Programmierung nicht nur aus Erfahrung lernen. Ich würde aus praktischen Gründen lieber eine funktionale Sprache lernen.
Alex Baranosky
9

Praktisch alles, was Sie in PP tun können, kann in FP getan werden, und umgekehrt. Es ist nur eine andere Art, etwas zu codieren - eine andere Perspektive auf das Problem und eine andere Art, es zu lösen.

Da jedoch nicht viele Benutzer FP verwenden, liegt das Problem eher im Mangel an guten Bibliotheken, der Portabilität / Wartbarkeit (da der Betreuer eine bessere Chance hat, etwas zu verstehen, das in C ++ geschrieben ist als im Schema), und im Mangel an Dokumentation und Community. Ich weiß, dass es einige Dokumente gibt, aber vergleichen Sie das mit C ++, C # oder Java und Sie werden verstehen, was ich meine.

Wenn Sie jedoch wirklich FP ausführen möchten, können Sie diesen Stil auch in C ++ und C # verwenden. Natürlich wird es kein 100% FP sein, wenn Sie die Standardbibliothek verwenden. Leider glaube ich nicht, dass C # für die Verwendung mit funktionaler Programmierung optimiert ist, und es wird wahrscheinlich viele Leistungsprobleme verursachen.

Dies ist eher ein subjektiver Beitrag, was ich über FP denke. Es ist keine strenge Erklärung.

user35978
quelle
7
"Praktisch alles, was Sie in PP tun können, kann in FP getan werden" - Eigentlich ist es genau alles.
BlueRaja - Danny Pflughoeft
2
@BlueRaja - beziehen Sie sich auf Turing-Vollständigkeit? Wenn ja, folgt das, was Sie sagen, nicht. Zum Beispiel ist Conways Spiel des Lebens Turing Complete, aber Sie können es nicht verwenden, um einen Grafikkartentreiber zu schreiben, wie Sie es in C können. Ebenso sehe ich keines der neuesten Spiele, die in Haskell geschrieben wurden. Kann in FP tun! = Könnte theoretisch in einem theoretischen FP tun.
Luigi Plinge
@Luigi Plinge Ich muss BlueRaja zustimmen. Haskeller diskutieren einige in Haskell geschriebene Linux-Treiber. Ich habe keinen Link, aber ich habe auch gehört, dass ein Betriebssystem in Haskell geschrieben wurde (möglicherweise auch andere funktionale Sprachen). Was Spiele angeht, sehe ich nicht, dass die neuesten Spiele in C # oder Java geschrieben wurden. Wollen Sie damit sagen, dass sie für solche Spiele nicht verwendet werden können? Wie auch immer, ein Beispiel für ein Spiel, das in FP geschrieben wird. Denken Sie auch daran, dass die meisten meiner Links Haskell sind, eine rein funktionale Sprache.
Austinprete
@PardonMyRhetoric Sie können natürlich Spiele in Haskell schreiben und jede Berechnung durchführen, aber die Geschwindigkeit ist um ein Vielfaches langsamer und die Speichernutzung höher. Ein Gegenbeispiel zu BlueRajas Aussage wäre also, dass man in FP nicht "ein Spiel schreiben kann, das so schnell ist und so viel Speicher in C verbraucht". Dies ist ein echtes praktisches Problem, kein pedantischer Trick (und ich bin überhaupt nicht darauf aus, FP zu verprügeln - ich programmiere gerade Scala!).
Luigi Plinge
1
@PardonMyRhetoric Es muss auch eine idiomatische FP sein. Die Benchmarks, die eine Haskell-Leistung ergeben, die der von C nahekommt, sind in einem unidiomatischen "Low-Level" -Stil geschrieben, den die meisten Haskell-Programmierer nicht schreiben konnten. Zum Beispiel könnten Sie eine ähnliche Leistung erzielen, indem Sie einfach Ihren Haskell-Code ausgeben und C-Code kompilieren. Aber sinnlos. Eine verwandte praktische Frage ist, was "Sie können" und was "getan werden kann / könnte". Wenn etwas einfach zu schwierig ist, spielt es keine Rolle, ob es theoretisch möglich ist (und für wen "möglich"?).
Luigi Plinge
4

Funktionale Sprachen sind in vielen Situationen gut. Dies hängt von den Bibliotheken einer bestimmten Funktionssprache ab.

Wie würden Sie die Frage "Wann sollte eine objektorientierte Programmiersprache verwendet werden?" Beantworten?

Jules
quelle
1
"Wann soll eine objektorientierte Programmiersprache verwendet werden?" Wenn Sie etwas rechnerisch modellieren möchten, habe ich andererseits nach einem Problem gesucht, bei dem fp die intuitive Antwort ist. Ich suche immer noch, so habe ich diesen Beitrag gefunden.
Jimjim
@Arjang Ich denke, funktionale Programmierung würde eine enorme Verwendung in Berechnungsanwendungen finden, die nur Eingaben benötigen, um Ausgaben zu generieren. Keine Veränderlichkeit und keine Iteration
EdgeDev
3

Obwohl dies eine subjektive Frage ist, möchte ich nur hinzufügen, dass funktionale Sprachen häufig zum Parsen domänenspezifischer Sprachen verwendet werden . Die funktionale Natur eignet sich gut zum Parsen von Grammatiken.

csl
quelle
2
DSLs analysieren? Ich dachte, mit Lisp-Makros und dergleichen werden DSLs als Makros implementiert , die von Lisp-Programmen nicht analysiert werden müssen. YMMV mit Nicht-Lisp-Sprachen. :-P
Chris Jester-Young
1

Nach allem, was ich gesehen habe, ist es eher eine Frage des Geschmacks als der Funktionalität (kein Wortspiel beabsichtigt). Es gibt wirklich nichts an einem Sprachstil, was es bei bestimmten Aufgaben von Natur aus besser oder schlechter macht.

TED
quelle
2
@ JonHarrop - Möchtest du das näher erläutern? Ich finde es nicht so offensichtlich, und es wäre eine Schande, wenn Sie den Eindruck hinterlassen würden, Sie würden Leute aus Meer Boosterisim abwählen.
Ted
1
Die ML-Sprachfamilie wurde speziell für die Metaprogrammierung gezüchtet, wobei ausgefeilte Sprachmerkmale wie Mustervergleich zur Manipulation von Bäumen (z. B. Ausdrucksbäume) hinzugefügt wurden. Folglich ist diese Sprachfamilie bei dieser spezifischen Aufgabe von Natur aus viel besser.
JD
1
@ JonHarrop - das akzeptiere ich. Sie sprechen jedoch von ML, nicht von funktionalen Sprachen im Allgemeinen. Ich glaube fest an DSLs, daher werde ich mit Sicherheit nicht dagegen argumentieren, eine bestimmte Sprache für die genaue Aufgabe zu verwenden, für die sie entwickelt wurde.
TED
Heutzutage findet sich der Mustervergleich in fast allen funktionalen Sprachen, einschließlich OCaml, F #, Scala, Haskell, Clojure und Erlang. Zum Beispiel habe ich kürzlich eine maßgeschneiderte Engine für Geschäftsregeln für einen Kunden mit Schwerpunkt Mathematik erstellt. Das sind 1.000 Zeilen F # und es handelt sich überwiegend um einen Interpreter. Lexing, Parsing, Typprüfung und Interpretation von Eingaben sind dank Pattern Matching viel einfacher.
JD
@ JonHarrop .. aber nicht alle. Es ist kein inhärentes Merkmal funktionaler Sprachen, worum es bei der Frage ging.
Ted
1

Verwenden Sie im Allgemeinen die Sprache, in der es am einfachsten ist, die Lösung eines Problems auszudrücken. Für die funktionale Programmierung ist dies der Fall, wenn die Lösung eines Problems leicht in Funktionen ausgedrückt werden kann , daher der Name. Im Allgemeinen ist es gut für mathematische Operationen, KI, Mustervergleich; Im Allgemeinen alles, was in eine Reihe von Regeln zerlegt werden kann, die angewendet werden müssen, um eine Antwort zu erhalten. Sie können die "beste" Sprache erst dann wirklich bestimmen, wenn Sie Ihr Problem ausreichend analysiert haben. Hier bietet sich Pseudocode an. Wenn Sie feststellen, dass Sie Pseudocode schreiben, der wie FP aussieht, verwenden Sie FP.

Natürlich sind alle vollständigen Programmiersprachen funktional gleichwertig, daher spielt es keine Rolle, welche Sie auswählen, um welche Probleme Sie lösen können. Die Haupteffekte betreffen die Effizienz und Genauigkeit der Codierung sowie die einfache Wartung.

Beachten Sie auch, dass es möglich ist, FP in OO-Sprachen durch clever gestaltete APIs nachzuahmen. Ich habe zum Beispiel zahlreiche Java-Bibliotheken gesehen (JMock ist ein Beispiel), die Methodenverkettung verwenden, um ein FP-DSL zu simulieren. Dann sehen Sie Konstrukte wie:

logger.expects(once()).method("error") .with( and(stringContains(action),stringContains(cause)) );

Dadurch wird im Wesentlichen eine Funktion erstellt, die ausgewertet wird, um festzustellen, ob eine Aufrufsequenz für ein Scheinobjekt korrekt ist. (Beispiel gestohlen von http://www.jmock.org/yoga.html )

Eine andere FP-ähnliche Syntax in anderen OO-Sprachen ist die Verwendung von Verschlüssen, z. B. in Ruby.

Phil
quelle
2
"... es spielt keine Rolle, welches Sie wählen, um welche Probleme Sie sich lösen können". Nur wenn Sie unendlich viel Zeit und Geld haben, um Ihr Problem zu lösen.
JD