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.
Why do we want successive calls to a function to yield the same result. What is the problem with the way things are in C? I never understood this.
Es gibt zwei verschiedene Definitionen von "funktionaler Programmierung", die heute allgemein verwendet werden:
Die ältere Definition (die von Lisp stammt) besagt, dass es bei der funktionalen Programmierung um die Programmierung mit erstklassigen Funktionen geht, dh Funktionen werden wie jeder andere Wert behandelt, sodass Sie Funktionen als Argumente an andere Funktionen übergeben und Funktionen Funktionen unter ihren Rückgabewerten zurückgeben können. Dies gipfelt in der Verwendung von Funktionen höherer Ordnung wie
map
undreduce
(Sie haben vielleicht vonmapReduce
einer einzelnen Operation gehört, die häufig von Google verwendet wird, und es ist nicht überraschend, dass es sich um einen nahen Verwandten handelt!). Die .NET-TypenSystem.Func
undSystem.Action
stellen Funktionen höherer Ordnung in C # zur Verfügung. Obwohl das Currying in C # unpraktisch ist, sind Funktionen, die andere Funktionen als Argumente akzeptieren, häufig, zParallel.For
. B. die Funktion.Die jüngere Definition (von Haskell populär gemacht) ist, dass es bei der funktionalen Programmierung auch darum geht, Nebenwirkungen einschließlich Mutationen zu minimieren und zu kontrollieren, dh Programme zu schreiben, die Probleme durch das Verfassen von Ausdrücken lösen. Dies wird häufiger als "rein funktionale Programmierung" bezeichnet. Dies wird durch völlig unterschiedliche Ansätze für Datenstrukturen ermöglicht, die als "rein funktionale Datenstrukturen" bezeichnet werden. Ein Problem besteht darin, dass die Übersetzung traditioneller imperativer Algorithmen zur Verwendung rein funktionaler Datenstrukturen die Leistung in der Regel um das 10-fache verschlechtert. Haskell ist die einzige überlebende rein funktionale Programmiersprache, aber die Konzepte haben sich in die Mainstream-Programmierung mit Bibliotheken wie
Linq
in .NET eingeschlichen.Überall. Lambdas in C # haben jetzt große Vorteile gezeigt. C ++ 11 hat Lambdas. Es gibt keine Entschuldigung, Funktionen höherer Ordnung jetzt nicht zu verwenden. Wenn Sie eine Sprache wie F # verwenden können, profitieren Sie auch von Typinferenz, automatischer Generalisierung, Currying und teilweiser Anwendung (sowie vielen anderen Sprachfunktionen!).
Ja. C ist eine prozedurale Sprache. Sie können jedoch einige Vorteile der funktionalen Programmierung nutzen, indem Sie Funktionszeiger und
void *
in C verwenden.quelle
Vielleicht lohnt es sich, diesen Artikel über F # "101" auf CoDe Mag zu lesen, der kürzlich veröffentlicht wurde.
Außerdem hat Dustin Campbell einen großartigen Blog, in dem er viele Artikel über seine Abenteuer veröffentlicht hat, wie man sich mit F # vertraut macht.
Ich hoffe du findest diese nützlich :)
BEARBEITEN:
Um nur hinzuzufügen, mein Verständnis der funktionalen Programmierung ist, dass alles eine Funktion oder Parameter einer Funktion ist und nicht Instanzen / zustandsbehaftete Objekte. Aber ich könnte mich irren. F # ist etwas, worauf ich mich einlassen möchte, aber einfach nicht die Zeit haben! :) :)
quelle
Der Beispielcode von John the Statistician zeigt keine funktionale Programmierung an, da bei der funktionalen Programmierung der Schlüssel darin besteht, dass der Code KEINE ZUWEISUNGEN ausführt (
record = thingConstructor(t)
ist eine Zuweisung) und KEINE NEBENWIRKUNGEN hat (localMap.put(record)
eine Anweisung mit Nebeneffekt). . Aufgrund dieser beiden Einschränkungen wird alles, was eine Funktion tut, vollständig von ihren Argumenten und ihrem Rückgabewert erfasst. Schreiben Sie den Code des Statistikers so um, wie er aussehen müsste, wenn Sie eine funktionale Sprache mit C ++ emulieren möchten:Aufgrund der Regel ohne Nebenwirkungen ist jede Anweisung Teil des Rückgabewerts (daher
return
steht sie an erster Stelle ), und jede Anweisung ist ein Ausdruck. In Sprachen, die die funktionale Programmierung erzwingen, ist dasreturn
Schlüsselwort impliziert, und die if- Anweisung verhält sich wie der?:
Operator von C ++ .Außerdem ist alles unveränderlich, daher
localMap.put
muss eine neue Kopie von localMap erstellt und zurückgegeben werden, anstatt die ursprüngliche localMap wie bei einem normalen C ++ - oder Java-Programm zu ändern . Abhängig von der Struktur von localMap kann die Kopie Zeiger auf das Original wiederverwenden, wodurch die zu kopierende Datenmenge verringert wird.Zu den Vorteilen der funktionalen Programmierung gehört die Tatsache, dass funktionale Programme kürzer sind und es einfacher ist, ein funktionales Programm zu ändern (da keine versteckten globalen Effekte zu berücksichtigen sind), und es einfacher ist, das Programm direkt in das Programm zu integrieren erster Platz.
Funktionsprogramme werden jedoch in der Regel langsam ausgeführt (aufgrund all der zu kopierenden Aufgaben) und sie interagieren nicht gut mit anderen Programmen, Betriebssystemprozessen oder Betriebssystemen, die sich mit Speicheradressen befassen, Little-Endian Byteblöcke und andere maschinenspezifische, nicht funktionierende Bits. Der Grad der Nichtinteroperabilität korreliert tendenziell umgekehrt mit dem Grad der funktionellen Reinheit und der Strenge des Typsystems.
Die populäreren funktionalen Sprachen haben wirklich sehr, sehr strenge Typsysteme. In OCAML können Sie nicht einmal Ganzzahl- und Gleitkomma-Mathematik mischen oder dieselben Operatoren verwenden (+ dient zum Hinzufügen von Ganzzahlen, +. Zum Hinzufügen von Gleitkommazahlen). Dies kann entweder ein Vorteil oder ein Nachteil sein, je nachdem, wie sehr Sie die Fähigkeit eines Typprüfers schätzen, bestimmte Arten von Fehlern zu erkennen.
Funktionale Sprachen haben in der Regel auch sehr große Laufzeitumgebungen. Haskell ist eine Ausnahme (ausführbare GHC-Programme sind sowohl zur Kompilierungszeit als auch zur Laufzeit fast so klein wie C-Programme), aber SML-, Common Lisp- und Scheme-Programme benötigen immer Tonnen Speicher.
quelle
Ja, Sie denken zu Recht, dass C eine nicht funktionierende Sprache ist. C ist eine prozedurale Sprache.
quelle
Ich bevorzuge die funktionale Programmierung, um mir wiederholte Arbeit zu ersparen, indem ich eine abstraktere Version erstelle und diese stattdessen verwende. Lassen Sie mich ein Beispiel geben. In Java erstelle ich häufig Karten, um Strukturen aufzuzeichnen und damit getOrCreate-Strukturen zu schreiben.
Das kommt sehr oft vor. Jetzt konnte ich in einer funktionalen Sprache schreiben
und ich würde nie wieder ein neues davon schreiben müssen, ich könnte es erben. Aber ich könnte es besser machen als zu erben, könnte ich im Konstruktor dieser Sache sagen
(wobei * eine Art Notation "Diesen Parameter offen lassen" ist, die eine Art Currying ist)
und dann ist das lokale getOrCreate genau das gleiche wie es gewesen wäre, wenn ich das Ganze in einer Zeile ohne Vererbungsabhängigkeiten geschrieben hätte.
quelle
Wenn Sie nach einem guten Text auf F # suchen
Expert F # wird von Don Syme mitgeschrieben. Schöpfer von F #. Er arbeitete speziell an Generika in .NET, damit er F # erstellen konnte.
F # ist OCaml nachempfunden, sodass Sie mit jedem OCaml-Text auch F # lernen können.
quelle
Ich finde Was ist funktionale Programmierung? um nützlich zu sein
Bevorzugen Sie explizite
when
ParameterÜber
quelle