Warum funktionale Sprachen? [geschlossen]


332

Ich sehe hier viel Gerede über funktionale Sprachen und so. Warum würden Sie eine über eine "traditionelle" Sprache verwenden? Was machen sie besser? Worin sind sie schlimmer? Was ist die ideale funktionale Programmieranwendung?


John Hughes hat einen Artikel darüber geschrieben: Warum funktionale Programmierung wichtig ist .
Hjulle

Antworten:


214

Funktionale Sprachen verwenden ein anderes Paradigma als imperative und objektorientierte Sprachen. Sie verwenden nebenwirkungsfreie Funktionen als Grundbaustein in der Sprache. Dies ermöglicht viele Dinge und erschwert viele Dinge (oder unterscheidet sich in den meisten Fällen von dem, was Menschen gewohnt sind).

Einer der größten Vorteile bei der funktionalen Programmierung besteht darin, dass die Reihenfolge der Ausführung von nebenwirkungsfreien Funktionen nicht wichtig ist. In Erlang wird dies beispielsweise verwendet, um die Parallelität auf sehr transparente Weise zu aktivieren. Und weil sich Funktionen in funktionalen Sprachen sehr ähnlich wie mathematische Funktionen verhalten, ist es einfach, diese in funktionale Sprachen zu übersetzen. In einigen Fällen kann dies die Lesbarkeit des Codes verbessern.

Traditionell war einer der großen Nachteile der funktionalen Programmierung auch das Fehlen von Nebenwirkungen. Es ist sehr schwierig, nützliche Software ohne E / A zu schreiben, aber E / A ist ohne Nebenwirkungen in Funktionen schwer zu implementieren. Daher haben die meisten Menschen nie mehr aus der funktionalen Programmierung herausgeholt, als eine einzelne Ausgabe aus einer einzelnen Eingabe zu berechnen. In modernen Mischparadigmensprachen wie F # oder Scala ist dies einfacher.

Viele moderne Sprachen enthalten Elemente aus funktionalen Programmiersprachen. C # 3.0 verfügt über viele funktionale Programmierfunktionen, und Sie können auch in Python funktionale Programmierung durchführen. Ich denke, die Gründe für die Popularität der funktionalen Programmierung liegen hauptsächlich in zwei Gründen: Parallelität wird bei der normalen Programmierung zu einem echten Problem, da wir immer mehr Multiprozessor-Computer bekommen. und die Sprachen werden zugänglicher.


14
Sie können funktionale Programmierung in Python durchführen, aber es ist wirklich schrecklich. stackoverflow.com/questions/1017621/…
Gordon Gustafson

28
Es ist nicht schwer, E / A-Code in reinen Funktionssprachen zu schreiben. Sie alle bieten einen einfachen Mechanismus zum Schreiben von E / A-Code, der genauso funktioniert wie in imperativen Sprachen. Sie erzwingen lediglich, dass Sie keinen E / A-Code in einem anderen Code aufrufen können, dessen Schnittstelle als nicht E / A-fähig deklariert ist. Eine Analogie wäre eine dynamische Sprachprogrammiererin, die sich darüber beschwert, dass eine statisch typisierte Sprache wie Java es schwierig macht, den von einer Methode gewünschten Typ zurückzugeben, da sie den von der Typdeklaration angegebenen Wert zurückgeben muss.
Ben

9
Haskell ist ein Beispiel für eine reine funktionale Sprache, die nicht den von Ihnen genannten Nachteil hat. Es erleichtert den Umgang mit Nebenwirkungen erheblich, da Nebenwirkungen eingekapselt sind, und ermöglicht es dem Programmierer, ein viel leistungsfähigeres Abstraktionsniveau als imperative Sprachen zu erreichen ... Wirklich, jeder sollte Haskell ausprobieren, es wirklich verstehen und erkennen warum es so mächtig ist.
FtheBuilder

202

Ich glaube nicht, dass es eine Frage zum funktionalen Ansatz der Programmierung gibt, der sich durchsetzt, da er seit etwa 40 Jahren (als Programmierstil) verwendet wird. Immer wenn ein OO-Programmierer sauberen Code schreibt, der unveränderliche Objekte bevorzugt, leiht dieser Code funktionale Konzepte aus.

Sprachen, die einen funktionalen Stil erzwingen, erhalten heutzutage jedoch viel virtuelle Tinte, und ob diese Sprachen in Zukunft dominant werden, ist eine offene Frage. Mein eigener Verdacht ist, dass hybride Multi-Paradigmen-Sprachen wie Scala oder OCaml wahrscheinlich über "puristische" Funktionssprachen dominieren werden, genauso wie die reine OO-Sprache (Smalltalk, Beta usw.) die Mainstream-Programmierung beeinflusst hat, aber noch nicht beendet ist als die am häufigsten verwendeten Notationen.

Schließlich kann ich nicht widerstehen, darauf hinzuweisen, dass Ihre Kommentare zu FP in hohem Maße parallel zu den Bemerkungen sind, die ich vor nicht allzu vielen Jahren von prozeduralen Programmierern gehört habe:

  • Der (mythische, meiner Meinung nach) "durchschnittliche" Programmierer versteht es nicht.
  • Es ist nicht weit verbreitet.
  • Jedes Programm, das Sie damit schreiben können, kann mit aktuellen Techniken auf andere Weise geschrieben werden.

Ebenso wie grafische Benutzeroberflächen und "Code als Geschäftsmodell" Konzepte waren, die dazu beigetragen haben, dass OO allgemein anerkannt wurde, glaube ich, dass eine verstärkte Verwendung von Unveränderlichkeit und einfachere (massive) Parallelität mehr Programmierern helfen wird, die Vorteile des funktionalen Ansatzes zu erkennen . Aber so viel wir in den letzten 50 Jahren gelernt haben , die die gesamte Geschichte der digitalen Computerprogrammierung ausmachen, ich denke, wir müssen noch viel lernen. In zwanzig Jahren werden Programmierer erstaunt auf die primitive Natur der Tools zurückblicken, die wir derzeit verwenden, einschließlich der mittlerweile beliebten OO- und FP-Sprachen.


55
Schauen Sie einfach 20 Jahre zurück. Ich glaube nicht, dass sich die Programmierung stark weiterentwickelt hat. Nun, haben Sie bessere Werkzeuge, vielleicht eine neue Sprache oder 2, aber im Grunde wird sich nicht viel ändern. Dies wird mehr als 20 Jahre dauern. Wir alle dachten einmal, wir würden im Jahr 2000 fliegende Autos sehen. :)
bibac

32
O'Caml ist allerdings irisch.
defmeta

7
@alex seltsam: "Unveränderlichkeit begünstigen" und "Nebenwirkungen vermeiden" sind seit geraumer Zeit sowohl in objektorientierten als auch in imperativen Programmierschulen gute Faustregeln. (Also, was ist nicht zu mögen? ;-)
joel.neely

101
@bibac: Vor 20 Jahren haben wir C-Code geschrieben und die Vorzüge von Clipper oder Turbo Pascal besprochen. Objektorientierung war das ausschließliche Reich der Akademiker. Zu behaupten, dass sich wenig geändert hat, ist geradezu absurd.
Daniel C. Sobral

24
@ Daniel: Bitte geben Sie eine Liste dieser Personen an, die sich für die "Verdienste" von Clipper ausgesprochen haben. Sie müssen gejagt und vor Gericht gestellt werden.
David

125

Das Hauptplus für mich ist die inhärente Parallelität, zumal wir uns jetzt von mehr MHz weg und hin zu immer mehr Kernen bewegen.

Ich denke nicht, dass es das nächste Programmierparadigma werden und OO-Methoden vollständig ersetzen wird, aber ich denke, wir werden an den Punkt kommen, an dem wir entweder einen Teil unseres Codes in einer funktionalen Sprache schreiben müssen oder unsere Allzwecksprachen wachsen, um mehr funktionelle Konstrukte einzuschließen.


4
Wir sehen dies bereits. Und es wird in Zukunft mehr passieren. Daher stimme ich in diesem Punkt zu 100% zu.
Jason Baker

Das Knifflige ist, dass es die gemeinsamen Aspekte von Nichts / Keine Nebenwirkungen von FP sind, die es für Parallelität so geeignet machen. Und das sind die Aspekte, die mit OO-Lösungen nicht gut zusammenpassen - es ist extrem schwierig , effektive Hybride herzustellen. Vielleicht FP-Kleber zwischen OO-Knoten?
James Brady

Für einen effektiven Hybrid werfen Sie einen Blick auf den 2.0-Zweig der Programmiersprache D. Es ist ein Alpha / Work in Progress, aber es kommt dahin.
Dsimcha

2
Ich fand diese Antwort interessant, ich kenne keine funktionale Sprache, warum werden sie als besser für Parallelität angesehen?
andandandand

26
Da es keine gemeinsam genutzten Daten gibt, haben Funktionen keine Nebenwirkungen. Alles, was Sie interessiert, ist der Rückgabewert. (Dies ist eine ziemlich schwierige Idee für eine OO / prozedurale Programmiererin, sich einen Überblick zu verschaffen.) Viele Funktionen können daher gleichzeitig aufgerufen werden, solange die Ausgabe von einer nicht als Eingabe für eine andere verwendet wird.
Tom Smith

79

Selbst wenn Sie nie professionell in einer funktionalen Sprache arbeiten, werden Sie durch das Verständnis der funktionalen Programmierung zu einem besseren Entwickler. Es gibt Ihnen eine neue Perspektive auf Ihren Code und die Programmierung im Allgemeinen.

Ich sage, es gibt keinen Grund, es nicht zu lernen.

Ich denke, die Sprachen, die funktionale und imperative Stile gut mischen, sind am interessantesten und am wahrscheinlichsten erfolgreich.


Guter Punkt, aber ich würde gerne eine Erklärung sehen, "auf welche Weise werden Sie ein besserer Entwickler"
mt3

20
Unterschiedliche Programmierparadigmen nähern sich Problemen aus unterschiedlichen Blickwinkeln und erfordern häufig eine "andere Denkweise" oder Denkweise. Und sich in verschiedenen Denkweisen zu üben (was bedeutet, zu lernen, welche in welcher Situation verwendet werden soll ...), ist niemals eine schlechte Sache.
PeSHIr

56

Ich bin immer skeptisch gegenüber dem nächsten großen Ding. Oft ist das Next Big Thing ein reiner Zufall der Geschichte, zur richtigen Zeit am richtigen Ort zu sein, egal ob die Technologie gut ist oder nicht. Beispiele: C ++, Tcl / Tk, Perl. Alle fehlerhaften Technologien, alle äußerst erfolgreich, weil sie entweder als Lösung der heutigen Probleme oder als nahezu identisch mit etablierten Standards oder als beides angesehen wurden. Funktionale Programmierung mag zwar großartig sein, aber das bedeutet nicht, dass sie übernommen wird.

Aber ich kann Ihnen sagen, warum die Leute von funktionaler Programmierung begeistert sind : Viele, viele Programmierer haben eine Art "Konvertierungserfahrung" gemacht, bei der sie feststellen, dass die Verwendung einer funktionalen Sprache sie beim Produzieren doppelt so produktiv (oder vielleicht zehnmal so produktiv) macht Code, der widerstandsfähiger gegen Änderungen ist und weniger Fehler aufweist. Diese Leute betrachten funktionale Programmierung als Geheimwaffe; Ein gutes Beispiel für diese Denkweise ist Paul Grahams Beating the Averages . Oh, und seine Bewerbung? E-Commerce-Webanwendungen.

Seit Anfang 2006 gibt es auch einige Begeisterung für funktionale Programmierung und Parallelität. Da sich Leute wie Simon Peyton Jones seit mindestens 1984 immer wieder um Parallelität sorgen, halte ich nicht den Atem an, bis funktionale Sprachen das Multicore-Problem lösen. Aber es erklärt einige der zusätzlichen Summen im Moment.

Im Allgemeinen leisten amerikanische Universitäten schlechte Arbeit beim Unterrichten von funktionaler Programmierung. Es gibt einen starken Kern der Unterstützung für das Unterrichten von Intro-Programmierung mithilfe von Schema , und Haskell genießt dort auch eine gewisse Unterstützung, aber es gibt nur sehr wenig Möglichkeiten, fortgeschrittene Techniken für funktionale Programmierer zu unterrichten. Ich habe einen solchen Kurs in Harvard unterrichtet und werde dies auch in diesem Frühjahr bei Tufts tun. Benjamin Pierce hat einen solchen Kurs bei Penn unterrichtet. Ich weiß nicht, ob Paul Hudak in Yale etwas getan hat. Die europäischen Universitäten machen einen viel besseren Job; Beispielsweise wird die funktionale Programmierung an wichtigen Orten in Dänemark, den Niederlanden, Schweden und Großbritannien hervorgehoben. Ich habe weniger Ahnung, was in Australasien passiert.


Ich weiß nichts über die britischen Universitäten. Es ist mehr als wahrscheinlich, dass viele Universitäten hier nur sehr wenige Programmiersprachen unterrichten (Java, C, vielleicht Perl, wenn Sie Glück haben). Das Problem hier ist der Qualitätsunterschied, da die besten (wenigen) Universitäten die besten CS-Programme haben.
Mike B

Ich bin nicht der Meinung, dass die Beispiele, die Sie gegeben haben, fehlerhaft sind, vielleicht eine Nische darstellen oder für bestimmte Bereiche geeignet sind, aber allgemein genug sind, um ohne eine massive Lernkurve universell aufgegriffen zu werden. Das ist wahrscheinlich der Hauptgrund, warum sie so erfolgreich sind.
Gbjbaanb

Ich habe Forth und Lisp an der Uni in Großbritannien gemacht (sowie Pascal, C, Modula2 und Cobol), aber das war vor 20 Jahren.
kpollock

29
An der Uni (in Australien) wurde mir Java / C ++ beigebracht, aber einige meiner Mitarbeiter besuchten verschiedene Universitäten, an denen sie mehrere Einheiten in Haskell absolvierten. Es wurde sowohl für die Einführung in die Programmierung als auch für eine ihrer Einheiten für das letzte Jahr verwendet. Ich lachte, als ich hörte, was mein Kollege zu einem Java-Dozenten sagte, nachdem er zum ersten Mal in das Casting eingeführt worden war (zu diesem Zeitpunkt kannte er nur Haskell) - "Was?! Du meinst, du hast etwas und du nicht. t WISSEN, um welchen Typ es sich handelt?! "
Jacob Stanley

1
Schau dir an, was mit C # mit all den Europäern im Team
passiert ist

32

Ich sehe hier im Raum niemanden, der den Elefanten erwähnt, also denke ich, dass es an mir liegt :)

JavaScript ist eine funktionale Sprache. Da immer mehr Leute mit JS fortgeschrittenere Dinge tun, insbesondere die Feinheiten von jQuery, Dojo und anderen Frameworks nutzen, wird FP durch die Hintertür des Webentwicklers eingeführt.

In Verbindung mit Schließungen macht FP JS-Code wirklich leicht und dennoch lesbar.

Prost, PS


2
So fing ich wirklich an, funktionale Programmierung zu graben. Nichts ist besser als die Liste von Prototype.js. Jede (Funktion (Element) {}) oder die gesamte Funktionsweise von jQuery.
Cory R. King

20
Mit Javascript kann man funktional programmieren. Es ist jedoch eine paradigmenübergreifende Sprache, die es einem ermöglicht, auf verschiedene Arten zu programmieren (was ich bevorzuge, aber das ist nicht relevant) ... OO, funktional, prozedural usw.
RHSeeger


Die jQuery-Objektmethoden sind nur Operationen in der Listenmonade. Die Verwendung eines Objekts, das einen Container (oder eine Sequenz) als Eingabe darstellt, und die Rückgabe eines Objektcontainers als Ausgabe ist ein gutes Beispiel für eine praktische Neuerfindung von fmap.
Jared Updike

25

Die meisten Anwendungen sind einfach genug, um auf normale OO-Weise gelöst zu werden

  1. OO Wege waren nicht immer "normal". Der Standard dieses Jahrzehnts war das marginalisierte Konzept des letzten Jahrzehnts.

  2. Funktionale Programmierung ist Mathematik. Paul Graham über Lisp (Ersatzfunktionale Programmierung für Lisp):

Die kurze Erklärung, warum diese Sprache der 1950er Jahre nicht veraltet ist, ist, dass es sich nicht um Technologie, sondern um Mathematik handelte und Mathematik nicht abgestanden wird. Der richtige Vergleich mit Lisp ist nicht die Hardware der 1950er Jahre, sondern beispielsweise der Quicksort-Algorithmus, der 1960 entdeckt wurde und immer noch die schnellste Allzweck-Sorte ist.


25

Ich wette, Sie wussten nicht, dass Sie funktional programmieren, als Sie Folgendes verwendeten:

  • Excel-Formeln
  • Quarzkomponist
  • JavaScript
  • Logo (Schildkrötengrafiken)
  • LINQ
  • SQL
  • Underscore.js (oder Lodash), D3

10
Wie wird Javascript als funktionale Programmierung angesehen?
Pacerier

8
Es verfügt über erstklassige Funktionen, Funktionen höherer Ordnung, Verschlüsse, anonyme Funktionen, teilweise Anwendung, Currying und Komposition.
Daniel1426

2
Haha. Einmal schrieb eine Excel-Formel zur Rückzahlung der Last, die breiter als der Bildschirm mit verschachtelten Funktionen war. Ich wusste irgendwie, dass ich funktional programmierte, kannte den Begriff aber noch nicht.
ProfK

7
Bitte fügen Sie C zu dieser Liste hinzu
Mandeep Janjua

2
@MandeepJanjua: Huh? Woher? Oder warum dann keine Sprache?
Gr.

18

Der durchschnittliche Unternehmensprogrammierer, z. B. die meisten Leute, mit denen ich zusammenarbeite, wird es nicht verstehen und die meisten Arbeitsumgebungen lassen Sie nicht darin programmieren

Das ist allerdings nur eine Frage der Zeit. Ein durchschnittlicher Unternehmensprogrammierer lernt, was auch immer das aktuelle große Ding ist. Vor 15 Jahren haben sie OOP nicht verstanden. Wenn sich FP durchsetzt, werden Ihre "durchschnittlichen Unternehmensprogrammierer" folgen.

Es wird nicht wirklich an Universitäten gelehrt (oder ist es heutzutage?)

Variiert stark. An meiner Universität ist SML die allererste Sprache, in die Studenten eingeführt werden. Ich glaube, das MIT unterrichtet LISP als Kurs im ersten Jahr. Diese beiden Beispiele mögen natürlich nicht repräsentativ sein, aber ich glaube, dass die meisten Universitäten zumindest einige optionale Kurse zu FP anbieten, auch wenn sie dies nicht zu einem obligatorischen Bestandteil des Lehrplans machen.

Die meisten Anwendungen sind einfach genug, um auf normale OO-Weise gelöst zu werden

Es geht aber nicht wirklich um "einfach genug". Wäre eine Lösung einfacher in FP (oder besser lesbar, robust, elegant, performant)? Viele Dinge sind "einfach genug, um in Java gelöst zu werden", aber es erfordert immer noch eine unglaubliche Menge an Code.

Denken Sie auf jeden Fall daran, dass FP-Befürworter seit mehreren Jahrzehnten behaupten, es sei das nächste große Ding. Vielleicht haben sie Recht, aber denken Sie daran, dass dies nicht der Fall war, als sie vor 5, 10 oder 15 Jahren dieselbe Behauptung aufstellten.

Eine Sache, die definitiv zu ihren Gunsten zählt, ist jedoch, dass C # in letzter Zeit eine scharfe Wendung in Richtung FP genommen hat, insofern es praktisch eine Generation von Programmierern zu FP-Programmierern macht, ohne dass sie es überhaupt bemerken . Das könnte den Weg für die "Revolution" der FP ebnen. Könnte sein. ;)


MIT verwendete Schema in seiner Einführung zu lehren CS natürlich, aber es nutzt Python jetzt.
Mipadi

1
"Vor 15 Jahren haben sie OOP nicht verstanden" - Das Problem ist, dass sie vor 15 Jahren auch FP nicht verstanden haben. Und das tun sie heute noch nicht.
Jason Baker

15

Der Mensch kann die Vollkommenheit und Unvollkommenheit seiner gewählten Kunst nicht verstehen, wenn er den Wert in anderen Künsten nicht sehen kann. Das Befolgen von Regeln erlaubt nur die Entwicklung bis zu einem Punkt in der Technik, und dann müssen der Schüler und der Künstler mehr lernen und weiter suchen. Es ist sinnvoll, sowohl andere als auch strategische Künste zu studieren.

Wer hat nicht mehr über sich selbst gelernt, indem er die Aktivitäten anderer beobachtet hat? Um das Schwert zu lernen, studiere die Gitarre. Um die Faust zu lernen, studieren Sie Handel. Nur das Schwert zu studieren, macht dich engstirnig und lässt dich nicht nach außen wachsen.

- Miyamoto Musashi, "Ein Buch mit fünf Ringen"


12

Ein wesentliches Merkmal einer funktionalen Sprache ist das Konzept erstklassiger Funktionen. Die Idee ist, dass Sie Funktionen als Parameter an andere Funktionen übergeben und als Werte zurückgeben können.

Bei der funktionalen Programmierung wird Code geschrieben, der den Status nicht ändert. Der Hauptgrund dafür ist, dass aufeinanderfolgende Aufrufe einer Funktion das gleiche Ergebnis liefern. Sie können Funktionscode in jeder Sprache schreiben, die erstklassige Funktionen unterstützt. Es gibt jedoch einige Sprachen wie Haskell, in denen Sie den Status nicht ändern können. Tatsächlich sollten Sie überhaupt keine Nebenwirkungen (wie das Ausdrucken von Text) verursachen - was so klingt, als ob es völlig nutzlos sein könnte.

Haskell verwendet stattdessen einen anderen Ansatz für IO: Monaden. Dies sind Objekte, die die gewünschte E / A-Operation enthalten, die von der obersten Ebene Ihres Interpreters ausgeführt werden soll. Auf jeder anderen Ebene sind sie einfach Objekte im System.

Welche Vorteile bietet die funktionale Programmierung? Die funktionale Programmierung ermöglicht die Codierung mit weniger Fehlerpotentialen, da jede Komponente vollständig isoliert ist. Die Verwendung von Rekursions- und erstklassigen Funktionen ermöglicht auch einfache Korrektheitsnachweise, die typischerweise die Struktur des Codes widerspiegeln.


12

Ich denke nicht, dass die meisten realistischen Leute glauben, dass sich funktionale Programmierung durchsetzen wird (wird zum Hauptparadigma wie OO). Schließlich sind die meisten geschäftlichen Probleme keine hübschen mathematischen Probleme, sondern haarige zwingende Regeln, um Daten zu verschieben und auf verschiedene Arten anzuzeigen, was bedeutet, dass sie nicht für ein reines funktionales Programmierparadigma geeignet sind (die Lernkurve von Monad übersteigt OO bei weitem).

OTOH, funktionale Programmierung macht das Programmieren Spaß. Es lässt Sie die inhärente, zeitlose Schönheit prägnanter Ausdrücke der zugrunde liegenden Mathematik des Universums schätzen. Die Leute sagen, dass das Erlernen der funktionalen Programmierung Sie zu einem besseren Programmierer macht. Das ist natürlich sehr subjektiv. Ich persönlich denke auch nicht, dass das völlig stimmt.

Es macht dich zu einem besseren Lebewesen.


6
Ich denke nicht, dass OO von Natur aus einfacher ist als FP. Es hängt wirklich von deinem Hintergrund ab (ich bin ein Mathematiker, rate mal, was ich viel einfacher finde? :) Verdammt, OO Leute und deine verrückten Regeln.
Temp2290

14
Monaden sind nicht schwer zu verstehen. Kaufen Sie sich nicht in diesen Bullcrap ein.
Rayne

-1 OOP ist schwieriger als FP
nur jemand

-1 Wir würden keine optimierenden Compiler mit OCaml oder Haskell schreiben, wenn FP nur für hübsche mathematische Probleme geeignet wäre.
Gracchus

8

Ich muss dicht sein, aber ich verstehe es immer noch nicht. Gibt es tatsächliche Beispiele für kleine Apps, die in einer funktionalen Sprache wie F # geschrieben sind, in der Sie im Quellcode nachsehen können, wie und warum es besser war, einen solchen Ansatz zu verwenden, als beispielsweise C #?


Gute Bemerkung +1. @ Mendelt: "zugänglicher"? Meinen Sie damit, dass die Kopfschmerzen schneller sind, wenn Sie sich den Code ansehen?
Patrick Honorez

2
Siehe diese F # -Bibliothek: quanttec.com/fparsec/tutorial.html . Ich würde gerne Beispielcode in C # mit Parsern sehen, die halb so elegant und lesbar aussahen wie der F # -Code, selbst wenn sie nach denselben Anweisungen kompiliert wurden. Versuchen Sie, FParsec von F # nach C # zu portieren, und sehen Sie, wie sich der Code aufbläht.
Jared Updike

8

Ich möchte darauf hinweisen, dass alles, was Sie über funktionale Sprachen gesagt haben, die meisten Leute vor etwa 20 Jahren über objektorientierte Sprachen sagten. Damals war es sehr üblich, von OO zu hören:

* The average corporate programmer, e.g. most of the people I work with, will not understand it and most work environments will not let you program in it
* It's not really taught at universities (or is it nowadays?)
* Most applications are simple enough to be solved in normal IMPERATIVE ways

Veränderung muss von irgendwoher kommen. Eine sinnvolle und wichtige Änderung wird sich vollziehen, unabhängig davon, ob in früheren Technologien geschulte Personen der Meinung sind, dass eine Änderung nicht erforderlich ist. Denken Sie, dass der Wechsel zu OO trotz aller Leute, die zu dieser Zeit dagegen waren, gut war?


2
* Der durchschnittliche Unternehmensprogrammierer, z. B. die meisten Leute, mit denen ich arbeite, wird es nicht verstehen und die meisten Arbeitsumgebungen lassen Sie nicht darin programmieren - das gilt immer noch für OOP an vielen Orten, an denen ich gearbeitet habe :) (natürlich sagen sie sie machen OOP, aber sie sind nicht)
Tolanj

7

F # könnte sich durchsetzen, weil Microsoft es vorantreibt.

Profi:

  • F # wird Teil der nächsten Version von Visual Studio sein
  • Microsoft baut seit einiger Zeit eine Community auf - Evangelisten, Bücher, Berater, die mit hochkarätigen Kunden zusammenarbeiten, bedeutende Präsenz auf MS-Konferenzen.
  • F # ist eine erstklassige .NET-Sprache und die erste funktionale Sprache, die eine wirklich große Grundlage hat (nicht, dass ich sage, dass Lisp, Haskell, Erlang, Scala, OCaml nicht viele Bibliotheken haben, sie sind einfach nicht so vollständig wie .NET ist)
  • Starke Unterstützung für Parallelität

Gegen:

  • F # ist sehr schwer zu starten, selbst wenn Sie gut mit C # und .Net umgehen können - zumindest für mich :(
  • Es wird wahrscheinlich schwierig sein, gute F # -Entwickler zu finden

Also gebe ich F # eine 50: 50-Chance, wichtig zu werden. Andere funktionale Sprachen werden es in naher Zukunft nicht schaffen.


6
Ich würde argumentieren, dass Scala eine ziemlich tiefe Grundlage für die JRE war.
CDMckay

2
In Bezug auf Bibliotheken hängt es wirklich davon ab, was Sie tun. F # richtet sich an den Finanzsektor und ist auch für das wissenschaftliche Rechnen anwendbar, aber OCaml verfügt tatsächlich über weitaus bessere Bibliotheken für solche Anwendungen als .NET. Als ich zum Beispiel von OCaml zu F # kam, fand ich keine anständige FFT und schrieb (und verkaufte) meine eigene in C # und dann in F #.
Jon Harrop

1
LINQ ist eine gute Brücke zur Verwendung von Funktionskonzepten mit C # und VB.Net ... Und ich finde es viel weniger schmerzhaft zu lesen als F #
Matthew Whited

5

Ich denke, ein Grund dafür ist, dass einige Leute der Meinung sind, dass der wichtigste Teil der Akzeptanz einer Sprache darin besteht, wie gut die Sprache ist . Leider sind die Dinge selten so einfach. Zum Beispiel würde ich argumentieren, dass der größte Faktor für Pythons Akzeptanz nicht die Sprache selbst ist (obwohl das so ist ziemlich wichtig). Der Hauptgrund, warum Python so beliebt ist, ist seine riesige Standardbibliothek und die noch größere Community von Bibliotheken von Drittanbietern.

Sprachen wie Clojure oder F # können die Ausnahme von der Regel sein, wenn man bedenkt, dass sie auf der JVM / CLR basieren. Daher habe ich keine Antwort für sie.


+1, aber vergessen Sie nicht die Kraft des Marketings und die Tatsache, dass der Berg an Legacy-Code Ihres Unternehmens aufgrund eines coolen neuen Trends nicht die Sprache wechseln wird.
Temp2290

Und Sie haben vergessen zu erwähnen: Google macht Python populär.
Hao Wooi Lim

4

Die meisten Anwendungen können in [Geben Sie hier Ihre Lieblingssprache, Ihr Lieblingsparadigma usw. ein] gelöst werden.

Obwohl dies zutrifft, können verschiedene Werkzeuge verwendet werden, um verschiedene Probleme zu lösen. Functional ermöglicht nur eine weitere Abstraktion auf höherer (höherer?) Ebene, mit der wir unsere Aufgaben bei korrekter Verwendung effektiver erledigen können.


4

Es scheint mir, dass diejenigen, die als Student nie Lisp oder Scheme gelernt haben, es jetzt entdecken. Wie bei vielen Dingen in diesem Bereich besteht die Tendenz, zu übertreiben und hohe Erwartungen zu wecken ...

Es wird vergehen.

Funktionale Programmierung ist großartig. Es wird jedoch nicht die Welt übernehmen. C, C ++, Java, C # usw. werden weiterhin verfügbar sein.

Ich denke, daraus werden mehr sprachübergreifende Fähigkeiten entstehen - zum Beispiel Dinge in einer funktionalen Sprache zu implementieren und dann in anderen Sprachen Zugriff auf diese Dinge zu gewähren.


1
C # ist jetzt eine funktionale Programmiersprache (genauso wie Lisp), da es erstklassige lexikalische Verschlüsse hat. In der Tat werden sie bereits in WPF und TPL verwendet. Die funktionale Programmierung ist also offensichtlich schon da.
Jon Harrop


3

Die Dinge bewegen sich seit einiger Zeit in eine funktionale Richtung. Die beiden coolen neuen Kinder der letzten Jahre, Ruby und Python, sind beide den funktionalen Sprachen radikal näher als vor ihnen - so sehr, dass einige Lisper damit begonnen haben, das eine oder andere als "nah genug" zu unterstützen.

Und da die massiv parallele Hardware einen evolutionären Druck auf alle ausübt - und funktionale Sprachen am besten geeignet sind, um mit den Änderungen umzugehen - ist es nicht mehr so ​​weit wie früher zu glauben, dass Haskell oder F # das nächste große Ding sein werden.


3

Haben Sie in letzter Zeit die Entwicklung der Programmiersprachen verfolgt? Jede neue Version aller gängigen Programmiersprachen scheint immer mehr Funktionen aus der funktionalen Programmierung zu übernehmen.

  • Schließungen, anonyme Funktionen, Übergabe und Rückgabe von Funktionen als Werte waren exotische Merkmale, die nur Lisp- und ML-Hackern bekannt waren. Aber nach und nach haben C #, Delphi, Python, Perl, Javascript Unterstützung für Schließungen hinzugefügt. Es ist nicht möglich, dass eine aufstrebende Sprache ohne Schließung ernst genommen wird.

  • Mehrere Sprachen, insbesondere Python, C # und Ruby, unterstützen native Listenverständnisse und Listengeneratoren.

  • ML war 1973 Pionier der generischen Programmierung, aber die Unterstützung für Generika ("parametrischer Polymorphismus") ist erst in den letzten 5 Jahren zum Industriestandard geworden. Wenn ich mich richtig erinnere, unterstützte Fortran Generika im Jahr 2003, gefolgt von Java 2004, C # im Jahr 2005 und Delphi im Jahr 2008. (Ich weiß, dass C ++ Vorlagen seit 1979 unterstützt, aber 90% der Diskussionen über C ++ 's STL beginnen mit "Hier gibt es Dämonen". .)

Was macht diese Funktionen für Programmierer attraktiv? Es sollte klar sein: Es hilft Programmierern, kürzeren Code zu schreiben . Alle Sprachen werden in Zukunft - zumindest - Schließungen unterstützen, wenn sie wettbewerbsfähig bleiben wollen. In dieser Hinsicht ist die funktionale Programmierung bereits im Mainstream.

Die meisten Anwendungen sind einfach genug, um auf normale OO-Weise gelöst zu werden

Wer sagt, dass funktionale Programmierung nicht auch für einfache Dinge verwendet werden kann? Nicht jedes Funktionsprogramm muss ein Compiler, ein Theorembeweiser oder ein massiv paralleler Telekommunikationsschalter sein. Zusätzlich zu meinen komplizierteren Projekten verwende ich regelmäßig F # für Ad-hoc-Wegwerfskripte.



3

Der Link wird nicht geöffnet. Fehler 403.
Alexey Frunze


Toter Link. Aus diesem Grund sind solche Antworten sowohl für das Zitieren als auch für das Verknüpfen ungünstig.
Sylwester

Ich habe den Link behoben. @ Sylwester das ist wahr, aber es ist ein 23-seitiges Dokument. Das Papier nach unten zu destillieren, um auf dieser Seite zu antworten, würde dem nicht gerecht werden.
Grom

2

Ich stimme dem ersten Punkt zu, aber die Zeiten ändern sich. Unternehmen werden reagieren, auch wenn sie spät adoptieren, wenn sie sehen, dass es einen Vorteil gibt. Das Leben ist dynamisch.

Sie unterrichteten Ende der 90er Jahre Haskell und ML in Stanford. Ich bin sicher, dass Orte wie Carnegie Mellon, MIT, Stanford und andere gute Schulen es den Schülern präsentieren.

Ich bin damit einverstanden, dass die meisten Apps, die relationale Datenbanken im Web verfügbar machen, noch lange in diesem Sinne bestehen bleiben. Java EE, .NET, RoR und PHP haben einige ziemlich gute Lösungen für dieses Problem entwickelt.

Sie sind auf etwas Wichtiges gestoßen: Es könnte das Problem sein, das nicht einfach mit anderen Mitteln gelöst werden kann, um die funktionale Programmierung zu verbessern. Was würde das sein?

Werden massive Multicore-Hardware und Cloud Computing sie vorantreiben?


2

Weil FP erhebliche Vorteile in Bezug auf Produktivität, Zuverlässigkeit und Wartbarkeit bietet. Many-Core kann eine Killer-App sein, mit der große Unternehmen trotz großer Mengen an Legacy-Code endlich umsteigen können. Darüber hinaus erhalten selbst große kommerzielle Sprachen wie C # aufgrund von Many-Core-Bedenken einen ausgeprägten funktionalen Charakter - Nebenwirkungen einfach passt nicht gut zu Parallelität und Parallelität.

Ich bin nicht der Meinung, dass "normale" Programmierer es nicht verstehen werden. Sie werden, genau wie sie schließlich OOP verstanden haben (was genauso mysteriös und seltsam ist, wenn nicht mehr).

Außerdem unterrichten die meisten Universitäten FP, viele unterrichten es sogar als ersten Programmierkurs.


Entschuldigung, aber FP war ungefähr dreimal so lang wie OOP. Es geht einfach nicht darum, mehr Zeit zu brauchen. Es wird etwas mehr brauchen, um FP zum Mainstream zu machen.
Jason Baker

Wie könnten Sie den Teil meines Beitrags verpassen, in dem ich erkläre, dass das "etwas mehr" sehr wohl vielkernig sein könnte? Und etwas "da sein" ist nicht wirklich relevant. Die Leute verstanden OOP, weil es zu dieser Zeit greifbare Vorteile bot. FP ist erst seit kurzem praktisch.
Sebastian

2

Wow - das ist eine interessante Diskussion. Meine eigenen Gedanken dazu:

FP macht einige Aufgaben relativ einfach (im Vergleich zu Nicht-FP-Sprachen). Nicht-FP-Sprachen beginnen bereits, Ideen von FP zu übernehmen, daher vermute ich, dass sich dieser Trend fortsetzen wird und wir eher eine Fusion sehen werden, die den Menschen helfen sollte, den Sprung zu FP zu erleichtern.


2

Ich weiß nicht, ob es sich durchsetzen wird oder nicht, aber nach meinen Untersuchungen lohnt es sich mit ziemlicher Sicherheit, eine funktionale Sprache zu lernen, und Sie werden zu einem besseren Programmierer. Nur das Verständnis der referenziellen Transparenz macht viele Entwurfsentscheidungen so viel einfacher - und die daraus resultierenden Programme sind viel einfacher zu überlegen. Wenn Sie auf ein Problem stoßen, handelt es sich im Grunde eher um ein Problem mit der Ausgabe einer einzelnen Funktion als um ein Problem mit einem inkonsistenten Zustand, der durch eine der Hunderten von Klassen / Methoden / Funktionen verursacht worden sein könnte in einer unparteiischen Sprache mit Nebenwirkungen.

Die Staatenlosigkeit von FP entspricht natürlicher der Staatenlosigkeit des Webs, und daher eignen sich funktionale Sprachen leichter für elegantere, RESTFUL-Webanwendungen. Im Gegensatz zu JAVA- und .NET-Frameworks, die auf schrecklich hässliche HACKS wie VIEWSTATE- und SESSION-Schlüssel zurückgreifen müssen, um den Anwendungsstatus und die (gelegentlich recht undichte) Abstraktion einer zustandsbehafteten imperativen Sprache auf einer im Wesentlichen zustandslosen Funktionsplattform wie dem Web beizubehalten.

Und je zustandsloser Ihre Anwendung ist, desto einfacher kann sie sich für die parallele Verarbeitung eignen. Schrecklich wichtig für das Web, wenn Ihre Website populär wird. Es ist nicht immer einfach, einer Site einfach mehr Hardware hinzuzufügen, um eine bessere Leistung zu erzielen.


2

Meiner Ansicht nach wird es sich jetzt durchsetzen, da Microsoft es viel weiter in den Mainstream gedrängt hat. Für mich ist es attraktiv, weil es für uns tun kann, weil es eine neue Herausforderung ist und weil es Beschäftigungsmöglichkeiten für die Zukunft bietet.

Einmal gemeistert, wird es ein weiteres Werkzeug sein, um uns als Programmierer produktiver zu machen.


2

Ein in der Diskussion übersehener Punkt ist, dass die besten Typsysteme in zeitgenössischen FP-Sprachen zu finden sind. Darüber hinaus können Compiler alle (oder zumindest die meisten) Typen automatisch ableiten.

Es ist interessant, dass man beim Programmieren von Java die Hälfte der Zeit damit verbringt, Typnamen zu schreiben, aber Java ist bei weitem nicht typsicher. Während Sie möglicherweise niemals Typen in ein Haskell-Programm schreiben (außer als eine Art vom Compiler geprüfte Dokumentation) und der Code 100% typsicher ist.


1

Zusätzlich zu den anderen Antworten zwingt das Gießen der Lösung in rein funktionalen Begriffen dazu, das Problem besser zu verstehen. Umgekehrt wird das Denken in einem funktionalen Stil bessere * Fähigkeiten zur Problemlösung entwickeln.

* Entweder weil das Funktionsparadigma besser ist oder weil es einen zusätzlichen Anstellwinkel bietet.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.