Funktionelle Programmierung

Im Informatik, Funktionelle Programmierung ist ein Programmierparadigma wo Programme konstruiert werden von bewirbt sich und Komponieren Funktionen. Es ist ein deklarative Programmierung Paradigma, in der Funktionsdefinitionen sind Bäume von Ausdrücke diese Karte Werte zu anderen Werten und nicht zu einer Sequenz von Imperativ Aussagen welche aktualisiert die Laufstaat des Programms.

In der funktionellen Programmierung werden Funktionen als behandelt als erstklassige Bürger, was bedeutet, dass sie an Namen gebunden sein können (einschließlich lokaler Kennungen), bestanden als Argumente, und ist zurückgekommen aus anderen Funktionen, genau wie alle anderen Datentyp kann. Dadurch können Programme in a geschrieben werden deklarativ und komponierbar Stil, wo kleine Funktionen in a kombiniert werden modular Benehmen.

Die funktionelle Programmierung wird manchmal als Synonym für ein Synonym behandelt rein funktionelle Programmierung, eine Teilmenge der funktionellen Programmierung, die alle Funktionen behandelt als deterministisch mathematisch Funktionen, oder reine Funktionen. Wenn eine reine Funktion mit einigen bestimmten Argumenten aufgerufen wird, wird sie immer das gleiche Ergebnis zurückgeben und von keinem Mutbaren beeinflusst werden Zustand oder andere Nebenwirkungen. Dies steht im Gegensatz zu unrein Verfahren, gemeinsam in Imperative Programmierung, die Nebenwirkungen haben können (z. B. Änderungen des Programms des Programms oder Eingabe eines Benutzers). Befürworter rein funktionaler Programmieransprüche, dass Programme durch Einschränkung von Nebenwirkungen weniger haben können Käfer, sei einfacher zu werden debuggen und Prüfung, und seien besser geeignet zu formelle Überprüfung.[1][2]

Funktionelle Programmierung hat ihre Wurzeln in Akademiesich aus dem entwickeln Lambda -Kalkül, ein formales Berechnungssystem, das nur auf Funktionen basiert. Funktionelle Programme waren in der Vergangenheit weniger beliebt als imperativ Common Lisp, Planen,[3][4][5][6] Clojure, Wolfram Sprache,[7][8] Schläger,[9] Erlang,[10][11][12] Elixier,[13] Ocaml,[14][15] Haskell,[16][17] und F#.[18][19] Die funktionale Programmierung ist auch der Schlüssel zu einigen Sprachen, die in bestimmten Bereichen Erfolg gefunden haben JavaScript im Netz,[20] R in Statistiken,[21][22] J, K und Q in der Finanzanalyse und XQuery/Xslt zum Xml.[23][24] Domänenspezifische deklarative Sprachen wie Sql und Lex/Yacc Verwenden Sie einige Elemente der funktionalen Programmierung, z. B. nicht zulässt Veränderliche Werte.[25] Darüber hinaus unterstützen viele andere Programmiersprachen die Programmierung im funktionalen Stil oder haben Funktionen aus funktionaler Programmierung implementiert, wie z. C ++ 11, C#,[26] Kotlin,[27] Perl,[28] Php,[29] Python,[30] gehen,[31] Rost,[32] Raku,[33] Scala,[34] und Java (seit Java 8).[35]

Geschichte

Das Lambda -Kalkül, entwickelt in den 1930er Jahren von Alonzo -Kirche, ist ein formelles System von Berechnung gebaut von Funktionsanwendung. 1937 Alan Turing bewies, dass der Lambda -Kalkül und Turing -Maschinen sind äquivalente Berechnungsmodelle,[36] zeigen, dass der Lambda -Kalkül ist Turing vollständig. Lambda Calculus bildet die Grundlage aller funktionalen Programmiersprachen. Eine äquivalente theoretische Formulierung, Kombinationslogikwurde entwickelt von Moses Schönfinkel und Haskell Curry In den 1920er und 1930er Jahren.[37]

Die Kirche entwickelte später ein schwächeres System, das Einfach-typed Lambda-Kalkül, was den Lambda -Kalkül verlängerte, indem er a zugewiesen wurde Typ zu allen Begriffen.[38] Dies bildet die Grundlage für die statisch-typed funktionelle Programmierung.

Der Erste hohes Level funktionale Programmiersprache, LISPELNwurde Ende der 1950er Jahre für die entwickelt IBM 700/7000 Serie von wissenschaftlichen Computern von John McCarthy während bei Massachusetts Institute of Technology (MIT).[39] Die Lisp -Funktionen wurden mithilfe der Lambda -Notation der Kirche definiert, die mit einem Etikettskonstrukt erweitert wurde, um zuzulassen rekursiv Funktionen.[40] LISP führte zunächst viele paradigmatische Merkmale der funktionellen Programmierung ein, obwohl frühe LISPs waren Multi-Paradigma-Sprachenund integrierte Unterstützung für zahlreiche Programmierstile, wenn sich neue Paradigmen entwickelten. Spätere Dialekte, wie z. Planen und Clojure, und Ableger wie Dylan und Julia, versuchte, LISP um einen sauber funktionalen Kern zu vereinfachen und zu rationalisieren, während Common Lisp wurde entwickelt, um die paradigmatischen Merkmale der zahlreichen älteren Dialekte zu erhalten und zu aktualisieren.[41]

Informationsverarbeitungssprache (IPL), 1956, wird manchmal als erste computergestützte funktionale Programmiersprache zitiert.[42] Es ist ein Sprache im Assembly-Stil zum Manipulieren von Symbollisten. Es hat einen Vorstellung von Generator, welche eine Funktion ist, die eine Funktion als Argument akzeptiert, und da es sich um eine Sprache auf Assembly-Ebene handelt, kann Code Daten sein, sodass IPL als Funktionen höherer Ordnung angesehen werden kann. Es stützt sich jedoch stark von der Mutationslistenstruktur und ähnlichen imperativen Merkmalen.

Kenneth E. Iverson aufgetreten Apl In den frühen 1960er Jahren, beschrieben in seinem Buch von 1962 Eine Programmiersprache (ISBN9780471430148). APL war der Haupteinfluss auf John Backus's FP. In den frühen neunziger Jahren, Iverson und Roger Hui erstellt J. Mitte der 1990er Jahre, Arthur Whitney, der zuvor mit Iverson gearbeitet hatte, geschaffen wurde K, das kommerziell in der Finanzindustrie verwendet wird, zusammen mit seinem Nachkomme Q.

John Backus vorgestellt FP in seiner 1977 Turing Award Vortrag "kann Programmierung von der befreit werden von Neumann Stil? Ein funktionaler Stil und seine Algebra von Programmen ".[43] Er definiert Funktionsprogramme, die auf hierarchische Weise aufgebaut werden, indem er "Formulare kombinieren", die eine "Algebra von Programmen" ermöglichen. In der modernen Sprache bedeutet dies, dass funktionale Programme dem folgen Prinzip der Kompositionalität. Backus 'Papier populärte die Forschung in funktionaler Programmierung, obwohl sie hervorgehoben wurde Programmierung auf Funktionsebene anstatt der Lambda-Kalkulus-Stil jetzt, der jetzt mit funktionaler Programmierung verbunden ist.

Die Sprache von 1973 Ml wurde von Robin Milner Bei der Universität von Edinburgh, und David Turner entwickelte die Sprache Sasl Bei der Universität von St. Andrews. Auch in Edinburgh in den 1970er Jahren entwickelten Burstall und Darlington die funktionale Sprache Npl.[44] NPL basierte auf Kleene Recursion -Gleichungen und wurde zuerst in ihre Arbeit zur Programmtransformation eingeführt.[45] Burstall, MacQueen und Sannella haben dann die polymorphe Typprüfung von ML eingebaut, um die Sprache zu erzeugen Hoffnung.[46] ML entwickelte sich schließlich zu mehreren Dialekten, von denen die häufigsten sind Ocaml und Standard ml.

In den 1970ern, Guy L. Steele und Gerald Jay Sussman aufgetreten Planen, wie in der beschrieben Lambda Papiere und das Lehrbuch von 1985 Struktur und Interpretation von Computerprogrammen. Schema war der erste Dialekt von LISP, der verwendet wurde lexikaler Scoping und zu verlangen Schwanzoptimierung, Merkmale, die funktionale Programmierung fördern.

In den 1980er Jahren, Per Martin-Löf aufgetreten intuitionistische Typtheorie (auch genannt konstruktiv Typtheorie), die Funktionsprogramme mit assoziierten konstruktive Beweise ausgedrückt als abhängige Typen. Dies führte zu neuen Ansätzen zu Interaktiver Theorem -Beweis und hat die Entwicklung späterer funktioneller Programmiersprachen beeinflusst.

Die faule funktionale Sprache, Miranda, entwickelt von David Turner, erschien zunächst 1985 und hatte einen starken Einfluss auf Haskell. Da Miranda proprietär war, begann Haskell 1987 mit einem Konsens, um eine zu bilden offener Standard Für funktionelle Programmierforschung; Implementierungsveröffentlichungen sind seit 1990 noch nicht abgeschlossen.

In jüngerer Zeit wurde es in Nischen wie parametrisch verwendet CAD Mit freundlicher Genehmigung der OpenScad Die Sprache basiert auf dem CSG -Geometrie -Framework, obwohl ihre Einschränkung auf die Neuzuweisungwerte (alle Werte als Konstanten behandelt werden) zu Verwirrung bei Benutzern geführt hat, die mit funktionaler Programmierung als Konzept nicht vertraut sind.[47]

Die funktionale Programmierung wird weiterhin in kommerziellen Einstellungen verwendet.[48][49][50]

Konzepte

Eine Reihe von Konzepten und Paradigmen sind spezifisch für funktionelle Programme und im Allgemeinen fremd zu Imperative Programmierung (einschließlich Objekt orientierte Programmierung). Programmiersprachen richten sich jedoch häufig auf mehrere Programmierparadigmen aus, sodass Programmierer, die "meist imperative" Sprachen verwenden, einige dieser Konzepte verwendet haben.[51]

Erstklassige und höherer Ordnung Funktionen

Funktionen höherer Ordnung sind Funktionen, die entweder andere Funktionen als Argumente annehmen oder sie als Ergebnisse zurückgeben können. In Kalkül ist ein Beispiel für eine Funktion höherer Ordnung die Differentialoperator , was die zurückgibt Derivat einer Funktion .

Funktionen höherer Ordnung sind eng mit dem verwandt mit erstklassige Funktionen In diesen Funktionen höherer Ordnung und erstklassigen Funktionen ermöglichen beide Funktionen als Argumente und Ergebnisse anderer Funktionen. Die Unterscheidung zwischen den beiden ist subtil: "höherer Ordnung" beschreibt ein mathematisches Konzept von Funktionen, die bei anderen Funktionen wirken, während "First-Class" ein Informatikbegriff für Programmierspracheneinheiten ist, die keine Einschränkung auf ihre Verwendung haben (somit zuerst zuerst -Klassfunktionen können überall im Programm erscheinen, das andere erstklassige Unternehmen wie Zahlen können, einschließlich Argumente für andere Funktionen und als Rückgabewerte).

Funktionen höherer Ordnung ermöglichen teilweise Anwendung oder Currying, Eine Technik, die eine Funktion nacheinander auf ihre Argumente anwendet, wobei jede Anwendung eine neue Funktion zurückgibt, die das nächste Argument akzeptiert. Dadurch können ein Programmierer zum Beispiel das kursiv ausdrücken Nachfolgerfunktion als Additionsbetreiber teilweise auf die angewendet natürliche Zahl eines.

Reine Funktionen

Reine Funktionen (oder Ausdrücke) keine haben Nebenwirkungen (Speicher oder I/O). Dies bedeutet, dass reine Funktionen mehrere nützliche Eigenschaften haben, von denen viele zur Optimierung des Codes verwendet werden können:

  • Wenn das Ergebnis eines reinen Ausdrucks nicht verwendet wird, kann er entfernt werden, ohne andere Ausdrücke zu beeinflussen.
  • Wenn eine reine Funktion mit Argumenten aufgerufen wird, die keine Nebenwirkungen verursachen, ist das Ergebnis in Bezug auf diese Argumentliste konstant (manchmal genannt Referenztransparenz oder idempotenz), d. H. Wenn die reine Funktion mit denselben Argumenten erneut aufgerufen wird, gibt das gleiche Ergebnis zurück. (Dies kann das Zwischenspeicherungsoptimierungen ermöglichen, wie z. Memoisierung.))
  • Wenn es keine Datenabhängigkeit zwischen zwei reinen Ausdrücken gibt, kann ihre Reihenfolge umgekehrt werden oder sie können in durchgeführt werden parallel und sie können sich nicht gegenseitig beeinträchtigen (in anderen Begriffen ist die Bewertung eines reinen Ausdrucks Thread-safe).
  • Wenn die gesamte Sprache keine Nebenwirkungen zulässt, kann jede Bewertungsstrategie angewendet werden. Dies gibt dem Compiler die Freiheit, die Bewertung von Ausdrücken in einem Programm neu zu ordnen oder zu kombinieren (z. B. Verwenden Abholzung).

Während die meisten Compiler für imperative Programmiersprachen reine Funktionen erkennen und die Eliminierung der Common-SubExpression für reine Funktionsaufrufe ausführen, können sie dies nicht immer für vorgefertigte Bibliotheken tun, die diese Informationen im Allgemeinen nicht freilegen und so Optimierungen verhindern, die diese externen Funktionen betreffen. Einige Compiler wie z. GCCFügen Sie zusätzliche Schlüsselwörter für einen Programmierer hinzu, um externe Funktionen extern als rein zu markieren, um solche Optimierungen zu ermöglichen. Forran 95 Auch Funktionen werden benannt rein.[52] C ++ 11 hinzugefügt Constexpr Schlüsselwort mit ähnlicher Semantik.

Rekursion

Wiederholung (Looping) in funktionalen Sprachen wird normalerweise durch erreicht Rekursion. Rekursive Funktionen Rufen Sie sich auf und lassen Sie eine Operation wiederholt, bis sie das erreicht Basisfall. Im Allgemeinen erfordert Rekursion die Aufrechterhaltung a Stapel, der Platz in einer linearen Menge an die Tiefe der Rekursion verbraucht. Dies könnte die Rekursion unerschwinglich anstelle von imperativen Schleifen teuer machen. Eine besondere Form der Rekursion, bekannt als jedoch als Schwanzrekursion kann von einem Compiler in demselben Code erkannt und optimiert werden, der zur Implementierung der Iteration in imperativen Sprachen verwendet wird. Die Optimierung der Schwanzrekursion kann implementiert werden, indem das Programm in das Programm umgewandelt wird Fortsetzungsstil Während des Kompilierens unter anderem.

Das Planen Der Sprachstandard erfordert Implementierungen, um die richtige Schwanzrekursion zu unterstützen, was bedeutet, dass sie eine unbegrenzte Anzahl von aktiven Schwanzanrufen zulassen müssen.[53][54] Die richtige Schwanzrekursion ist nicht nur eine Optimierung. Es ist eine Sprachfunktion, die den Benutzern versichert, dass sie eine Rekursion verwenden können, um eine Schleife auszudrücken, und dies wäre sicher für den Raum.[55] Darüber hinaus berücksichtigt es im Gegensatz zu seinem Namen alle Schwanzaufrufe, nicht nur für die Schwanzrekursion. Während die ordnungsgemäße Schwanzrekursion normalerweise implementiert wird, indem Code in imperative Schleifen umgewandelt wird, können es implementiert. Zum Beispiel, HÄHNCHEN behält absichtlich einen Stapel bei und lässt die Paketüberfluss. Wenn dies jedoch passiert, ist es jedoch Müllsammler wird Platz zurückbeanspruchen,[56] Eine unbegrenzte Anzahl von aktiven Schwanzaufrufen zulässt, obwohl die Schwanzrekursion nicht in eine Schleife verwandelt.

Gemeinsame Rekursionsmuster können mit Funktionen höherer Ordnung abstrahiert werden, mit Katamorphismen und Anamorphismen (oder "Falten" und "entfaltet") die offensichtlichsten Beispiele. Solche Rekursionsschemata spielen eine Rolle analog zu integrierten Kontrollstrukturen wie z. Schleifen in Imperative Sprachen.

Die meisten funktionalen Programmiersprachen für allgemeine Zwecke ermöglichen eine uneingeschränkte Rekursion und sind Turing vollständig, was das macht Problem stoppen unentscheidbar, kann Ungesundheit von verursachen Gleichungsgeländeund erfordert im Allgemeinen die Einführung von Inkonsistenz in die Logik der Sprache der Sprache Typ System. Einige besondere Zwecksprachen wie z. Coq nur erlauben begründet Rekursion und sind stark normalisieren (Nicht terminierende Berechnungen können nur mit unendlichen Wertenströmen ausgedrückt werden Codata). Infolgedessen ist diese Sprachen nicht vollständig und es ist unmöglich, bestimmte Funktionen in ihnen auszudrücken, aber sie können dennoch eine breite Klasse interessanter Berechnungen ausdrücken und gleichzeitig die durch uneingeschränkten Rekursion verursachten Probleme vermeiden. Die funktionelle Programmierung, die auf begründete Rekursion mit einigen anderen Einschränkungen beschränkt ist Gesamtfunktionalprogrammierung.[57]

Strenge versus nicht strenge Bewertung

Funktionssprachen können dadurch kategorisiert werden, ob sie verwendet werden streng (eifrig) oder nicht streng (faul) Evaluierung, Konzepte, die darauf hinweisen, wie Funktionsargumente bearbeitet werden, wenn ein Ausdruck bewertet wird. Der technische Unterschied liegt in der Denotationssemantik von Ausdrücken, die fehlgeschlagene oder unterschiedliche Berechnungen enthalten. Unter strenger Bewertung schlägt die Bewertung eines Begriffs, der eine fehlgeschlagene Untermutung enthält, fehl. Zum Beispiel der Ausdruck:

Drucklänge ([2+1, 3*2, 1/0, 5-4])

scheitert unter strikter Bewertung aufgrund der Aufteilung im dritten Element der Liste um Null. Unter fauler Bewertung gibt die Längenfunktion den Wert 4 (d. H. Die Anzahl der Elemente in der Liste) zurück, da die Bewertung nicht versucht, die Begriffe zu bewerten, die die Liste ausmachen. Kurz gesagt, strikte Bewertung bewertet immer vollständige Funktionsargumente, bevor die Funktion aufgerufen wird. Die faule Bewertung bewertet keine Funktionsargumente, es sei denn, ihre Werte sind erforderlich, um den Funktionsaufruf selbst zu bewerten.

Die übliche Implementierungsstrategie für die faule Bewertung in funktionalen Sprachen ist Grafikreduzierung.[58] Eine faule Bewertung wird standardmäßig in mehreren reinen funktionalen Sprachen verwendet, einschließlich Miranda, Sauber, und Haskell.

Hughes 1984 argumentiert für eine faule Bewertung als Mechanismus zur Verbesserung der Programmmodularität durch Trennung von Bedenkendurch Erleichterung der unabhängigen Implementierung von Produzenten und Verbrauchern von Datenströmen.[2] Launchbury 1993 beschreibt einige Schwierigkeiten, die die faule Bewertung einführt, insbesondere bei der Analyse der Speicheranforderungen eines Programms, und schlägt eine vor Betriebssemantik bei einer solchen Analyse zu helfen.[59] Harper 2009 schlägt vor, sowohl eine strenge als auch faule Bewertung in derselben Sprache einzubeziehen, wobei das Typ der Sprache verwendet wird, um sie zu unterscheiden.[60]

Typsysteme

Insbesondere seit der Entwicklung von Hindley -Milner -Typ -Inferenz In den 1970er Jahren haben funktionale Programmiersprachen eher verwendet Typed Lambda Calculusalle ungültigen Programme zur Zusammenstellung Zeit und Risiken abzulehnen Falsche positive Fehlerim Gegensatz zu der Untyped Lambda Calculusund akzeptiert alle gültigen Programme zu Zusammenstellungszeit und Risiken Falsche negative Fehler, verwendet in Lisp und seinen Varianten (wie z. Planen), da sie alle ungültigen Programme zur Laufzeit ablehnen, wenn die Informationen ausreichen, um gültige Programme nicht abzulehnen. Die Verwendung von Algebraische Datentypen die Manipulation komplexer Datenstrukturen bequem; Durch das Vorhandensein einer starken Kompilierungs-Zeit-Überprüfung wird Programme ohne andere Zuverlässigkeitstechniken zuverlässiger wie zuverlässiger Testgetriebene Entwicklung, während Geben Sie Inferenz ein Befreit den Programmierer in den meisten Fällen von der Notwendigkeit, den Compiler manuell zum Compiler zu deklarieren.

Einige forschungsorientierte funktionale Sprachen wie z. Coq, Agda, Cayenne, und Epigramm basieren auf intuitionistische Typtheorie, wodurch Typen von Begriffen abhängen. Solche Typen werden genannt abhängige Typen. Diese Typsysteme haben keine entzündbare Inferenz und sind schwer zu verstehen und zu programmieren.[61][62][63][64] Aber abhängige Typen können willkürliche Aussagen in ausdrücken Logik höherer Ordnung. Durch die Curry -Howard IsomorphismusGut ausgestattete Programme in diesen Sprachen werden zu einem Mittel, um formal zu schreiben Mathematische Beweise von dem ein Compiler erzeugen kann Zertifizierter Code. Während diese Sprachen hauptsächlich für die akademische Forschung von Interesse sind (einschließlich in Formalisierte Mathematik), sie haben auch im Ingenieurwesen begonnen. Compcert ist ein Compiler für eine Untergruppe der C Programmiersprache Das ist in Coq geschrieben und formell überprüft.[65]

Eine begrenzte Form der abhängigen Typen genannt Verallgemeinerte algebraische Datentypen (GADTs) kann auf eine Weise implementiert werden, die einige der Vorteile einer abhängigen programmierten Programmierung bietet und gleichzeitig den größten Teil seiner Unannehmlichkeiten vermeidet.[66] GADTs sind in der erhältlich Glasgow Haskell Compiler, in Ocaml[67] und in Scala,[68] und wurden als Ergänzungen zu anderen Sprachen vorgeschlagen, darunter Java und C#.[69]

Referenztransparenz

Funktionsprogramme haben keine Zuweisungsanweisungen, dh den Wert einer Variablen in einem funktionalen Programm ändert sich nie, wenn einst definiert ist. Dies beseitigt die Chancen von Nebenwirkungen, da jede Variable durch ihren tatsächlichen Wert zu jedem Ausführungsminister ersetzt werden kann. Funktionelle Programme sind daher referentiell transparent.[70]

In Betracht ziehen C Zuweisungsanweisung x = x * 10Dies ändert den Wert der Variablen x. Sagen wir, dass der Anfangswert von x war 1, dann zwei aufeinanderfolgende Bewertungen der Variablen x ergibt 10 und 100 beziehungsweise. Klar ersetzen x = x * 10 mit beiden 10 oder 100 gibt einem Programm eine andere Bedeutung und so den Ausdruck ist nicht Referentiell transparent. Tatsächlich sind Zuweisungsanweisungen niemals referentiell transparent.

Betrachten Sie nun eine andere Funktion wie z. int plusone(int x) {return x+1;} ist transparent, da es den Eingang x nicht implizit ändert und daher keine solche hat Nebenwirkungen. Funktionsprogramme verwenden diese Art von Funktion ausschließlich und sind daher referenztransparent.

Datenstrukturen

Rein funktionell Datenstrukturen werden oft auf andere Weise dargestellt als ihre Imperativ Gegenstücke.[71] Zum Beispiel die Array Mit konstanten Zugriffs- und Update-Zeiten ist eine grundlegende Komponente der meisten imperativen Sprachen und viele imperative Datenstrukturen, wie die Hash-tabelle und Binärhaufen, basieren auf Arrays. Arrays können durch ersetzt werden durch Karten oder zufällige Zugriffslisten, die eine rein funktionale Implementierung zuzulassen, aber haben logarithmisch Zugangs- und Update -Zeiten. Rein funktionale Datenstrukturen haben Beharrlichkeit, eine Eigenschaft, frühere Versionen der Datenstruktur unmodifiziert zu halten. In Clojure werden anhaltende Datenstrukturen als funktionelle Alternativen zu ihren imperativen Gegenstücken verwendet. Persistente Vektoren verwenden beispielsweise Bäume für eine teilweise Aktualisierung. Das Aufrufen der Einfügungsmethode führt dazu, dass einige, aber nicht alle Knoten erstellt werden.[72]

Vergleich der imperativen Programmierung

Die funktionelle Programmierung unterscheidet sich stark von Imperative Programmierung. Die signifikantesten Unterschiede beruht auf der Tatsache, dass die funktionelle Programmierung vermeidet Nebenwirkungen, die in der imperativen Programmierung verwendet werden, um Status und E/O zu implementieren. Die reine funktionelle Programmierung verhindert die Nebenwirkungen vollständig und liefert referenzielle Transparenz.

Funktionen höherer Ordnung werden bei älteren imperativen Programmierungen selten eingesetzt. Ein traditionelles imperatives Programm könnte eine Schleife verwenden, um eine Liste zu durchqueren und zu ändern. Ein funktionales Programm hingegen würde wahrscheinlich eine „MAP“ -Funktion höherer Ordnung verwenden, die eine Funktion und eine Liste übernimmt, die eine neue Liste generiert und zurückgibt, indem die Funktion auf jedes Listenelement angewendet wird.

Imperativ vs. funktionales Programmieren

Die folgenden zwei Beispiele (geschrieben in JavaScript) Erzielen Sie den gleichen Effekt: Sie multiplizieren alle gleichmäßigen Zahlen in einem Array mit 10 und fügen sie alle hinzu, wodurch die endgültige Summe in der Variablen "Ergebnis" gespeichert wird.

Traditionelle Imperativschleife:

Const Zahlenliste = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; Lassen Ergebnis = 0; zum (Lassen i = 0; i < Zahlenliste.Länge; i++) {  wenn (Zahlenliste[i] % 2 === 0) {  Ergebnis += Zahlenliste[i] * 10;  } } 

Funktionelle Programmierung mit Funktionen höherer Ordnung:

Const Ergebnis = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]  .Filter(n => n % 2 === 0)  .Karte(a => a * 10)  .reduzieren((a, b) => a + b); 

Zustand simulieren

Es gibt Aufgaben (beispielsweise bei der Aufrechterhaltung eines Bankkontostats), die oft mit Staat am natürlichsten umgesetzt werden. Die reine funktionale Programmierung führt diese Aufgaben und E/A -Aufgaben wie das Akzeptieren von Benutzereingaben und das Drucken auf den Bildschirm auf unterschiedliche Weise aus.

Die reine funktionale Programmiersprache Haskell implementiert sie mithilfe Monaden, abgeleitet von Kategoriestheorie. Monaden bieten eine Möglichkeit, bestimmte Arten von Rechenmustern abstrahieren, darunter (aber nicht beschränkt auf) die Modellierung von Berechnungen mit veränderbarem Zustand (und anderen Nebenwirkungen wie I/O) auf imperative Weise, ohne Reinheit zu verlieren. Während vorhandene Monaden in einem Programm bei geeigneten Vorlagen und Beispielen leicht zu bewerben sind, haben viele Schüler sie konzeptionell schwer zu verstehen, z. B. wenn sie gebeten werden, neue Monaden zu definieren (was manchmal für bestimmte Arten von Bibliotheken benötigt wird).[73]

Funktionssprachen simulieren auch Zustände, indem sie unveränderliche Zustände weitergeben. Dies kann durchgeführt werden, indem eine Funktion den Zustand als einen seiner Parameter akzeptiert und zusammen mit dem Ergebnis einen neuen Zustand zurückgibt, wodurch der alte Zustand unverändert bleibt.[74]

Unreine funktionalen Sprachen enthalten normalerweise eine direktere Methode zur Verwaltung des Mutable -Zustands. ClojureVerwendet beispielsweise verwaltete Referenzen, die durch Anwenden reiner Funktionen auf den aktuellen Zustand aktualisiert werden können. Diese Art von Ansatz ermöglicht die Mutabilität und fördert gleichzeitig die Verwendung reiner Funktionen als bevorzugte Art, Berechnungen auszudrücken.

Alternative Methoden wie z. Hoare Logik und Einzigartigkeit wurden entwickelt, um Nebenwirkungen in Programmen zu verfolgen. Einige moderne Forschungssprachen verwenden Effektsysteme das Vorhandensein von Nebenwirkungen explizit machen.

Effizienzprobleme

Funktionelle Programmiersprachen sind in der Regel weniger effizient in ihrer Verwendung von Zentralprozessor und Erinnerung als imperative Sprachen wie z. C und Pascal.[75] Dies hängt mit der Tatsache zusammen, dass einige veränderliche Datenstrukturen wie Arrays eine sehr einfache Implementierung unter Verwendung der gegenwärtigen Hardware aufweisen. Flache Arrays können mit tiefem Pipeline -CPUs sehr effizient zugegriffen werden, effizient durch Caches (ohne komplexes Zeigerjagd) oder mit SIMD -Anweisungen behandelt werden. Es ist auch nicht einfach, ihre ebenso effizienten allgemeinen unveränderlichen Gegenstücke zu erstellen. Für rein funktionelle Sprachen ist die schlimmste Verlangsamung in der Anzahl der verwendeten Gedächtniszellen logarithmisch, da durch eine rein funktionelle Datenstruktur mit logarithmischer Zugriffszeit (wie einem ausgewogenen Baum) durch eine rein funktionelle Datenstruktur dargestellt werden kann.[76] Solche Verlangsamungen sind jedoch nicht universell. Für Programme, die intensive numerische Berechnungen durchführen, funktionale Sprachen wie z. Ocaml und Sauber sind nur etwas langsamer als C nach Das Computer mit Computersprachen -Benchmarks Spiel.[77] Für Programme, die groß umgehen Matrizen und mehrdimensional Datenbanken, Array funktionale Sprachen (wie z. J und K) wurden mit Geschwindigkeitsoptimierungen entwickelt.

Die Unveränderlichkeit von Daten kann in vielen Fällen zu einer Ausführungseffizienz führen, indem der Compiler Annahmen treffen kann, die in einer imperativen Sprache unsicher sind und so die Möglichkeiten für die Möglichkeiten erhöhen Inline -Expansion.[78]

Faule Bewertung kann das Programm auch asymptotisch beschleunigen, während es es höchstens um einen konstanten Faktor verlangsamen kann (es kann jedoch vorgestellt werden Speicherlecks bei unsachgemäßer Verwendung). Launchbury 1993[59] Erörtert theoretische Probleme im Zusammenhang mit Speicherlecks aus der faulen Bewertung und O'Sullivan et al. 2008[79] Geben Sie einige praktische Ratschläge für die Analyse und Behebung. Die allgemeinsten Implementierungen der faulen Bewertung, die die Verwendung von Derferende-Code und Daten ausführlich bei modernen Prozessoren mit tiefen Pipelines und mehrstufigen Caches (wo ein Cache-Fehlschlag Hunderte von Zyklen kosten kann), beeinträchtigt werden.

Funktionelle Programmierung in nicht funktionalen Sprachen

Es ist möglich, einen funktionalen Programmstil in Sprachen zu verwenden, die traditionell nicht als funktionale Sprachen betrachtet werden.[80] Zum Beispiel beides D[81] und Forran 95[52] Ausdrücklich reine Funktionen unterstützen.

JavaScript, Lua,[82] Python und gehen[83] hatte First Class -Funktionen von ihrer Gründung.[84] Python hatte Unterstützung für "Lambda","Karte","reduzieren", und "Filter"1994 sowie Schließungen in Python 2.2,[85] Obwohl Python 3 sich "reduzieren" auf die Functools Standardbibliotheksmodul.[86] Erstklassige Funktionen wurden in andere Mainstream-Sprachen wie zum Beispiel eingeführt Php 5.3, Visual Basic 9, C# 3.0, C ++ 11, und Kotlin.[27]

Im Php, Anonyme Klassen, Schließungen und Lambdas werden vollständig unterstützt. Bibliotheken und Sprachverlängerungen für unveränderliche Datenstrukturen werden entwickelt, um die Programmierung im funktionalen Stil zu unterstützen.

Im Java, Anonyme Klassen kann manchmal verwendet werden, um zu simulieren Schließungen;[87] Anonyme Klassen sind jedoch nicht immer richtig ersetzt werden Schließungen Weil sie nur begrenzte Fähigkeiten haben.[88] Java 8 unterstützt Lambda -Ausdrücke als Ersatz für einige anonyme Klassen.[89]

Im C#, Anonyme Klassen sind nicht notwendig, weil Schließungen und Lambdas werden vollständig unterstützt. Bibliotheken und Sprachverlängerungen für unveränderliche Datenstrukturen werden entwickelt, um die Programmierung im funktionalen Stil in C#zu unterstützen.

Viele objektorientierter Designmuster sind in funktionalen Programmierbegriffen ausdrücklich ausdrücklich: zum Beispiel die, die Strategiemuster bestimmt einfach die Verwendung einer Funktion höherer Ordnung und die Besucher Muster entspricht ungefähr a Katamorphismus, oder falten.

In ähnlicher Weise ist die Idee unveränderlicher Daten aus funktionaler Programmierung häufig in imperativen Programmiersprachen enthalten.[90] Zum Beispiel das Tupel in Python, ein unveränderliches Array, und Object.Freeze () in JavaScript.[91]

Anwendungen

Tabellenkalkulationen

Tabellenkalkulationen kann als Form von reinem, angesehen werden, Nächten, strikte Evaluierung funktionelles Programmiersystem.[92] Tabellenkalkulationen fehlen jedoch im Allgemeinen auch Funktionen höherer Ordnung sowie Code-Wiederverwendung, und in einigen Implementierungen fehlt auch eine Rekursion. Für Tabellenkalkulationsprogramme wurden verschiedene Erweiterungen entwickelt, um mehr Ordnung und wiederverwendbare Funktionen zu ermöglichen, aber bisher in erster Linie akademischer Natur.[93]

Akademie

Funktionelle Programmierung ist ein aktives Forschungsbereich im Bereich von Programmiersprache Theorie. Es gibt einige Peer-Review Veröffentlichungsorte, die sich auf funktionale Programmierung konzentrieren, einschließlich der Internationale Konferenz über funktionale Programme, das Journal of Functional Programming, und die Symposium über Trends in der funktionellen Programmierung.

Industrie

Die funktionelle Programmierung wird in einer Vielzahl von industriellen Anwendungen verwendet. Zum Beispiel, Erlang, was von der entwickelt wurde Schwedisch Gesellschaft Ericsson In den späten 1980er Jahren wurde ursprünglich zur Implementierung verwendet Fehlertoleranz Telekommunikation Systeme,[11] ist aber seitdem beliebt für den Aufbau einer Reihe von Anwendungen in Unternehmen wie z. B. Nortel, Facebook, Électricité de France und WhatsApp.[10][12][94][95][96] Planen, ein Dialekt von Lispelnwurde als Grundlage für mehrere Anwendungen frühzeitig verwendet Apple Macintosh Computers,[3][4] und wurde auf Probleme wie das Training angewendet Simulationssoftware[5] und Teleskop Kontrolle.[6] Ocaml, die Mitte der neunziger Jahre eingeführt wurde, wurde in Bereichen wie Finanzanalysen kommerziell verwendet.[14] Treiber Überprüfung, industriell Roboter Programmierung und statische Analyse von eingebettete Software.[15] Haskell, obwohl anfangs als Forschungssprache gedacht,[17] wurde auch von einer Reihe von Unternehmen angewendet, in Bereichen wie Luft- und Raumfahrtsystemen, Hardwaredesign und Webprogrammierung.[16][17]

Andere funktionale Programmiersprachen, die in der Industrie verwendet wurden Scala,[97] F#,[18][19] Wolfram Sprache,[7] Lispeln,[98] Standard ml,[99][100] und Clojure.[101]

Funktionelle "Plattformen" sind im Finanzbereich für Risikoanalysen beliebt (insbesondere bei den größeren Investmentbanken). Risikofaktoren werden als Funktionen codiert, die voneinander abhängige Grafiken (Kategorien) bilden, um Korrelationen in Marktverschiebungen zu messen Gröbner -Basis Optimierungen, aber auch für die Einhaltung von Regulierungen wie z. Umfassende Kapitalanalyse und Überprüfung. Angesichts der Verwendung von Ocaml oder Caml Variationen in der Finanzierung werden diese Systeme manchmal als im Zusammenhang mit a betrachtet Kategorische abstrakte Maschine oder Kamera. In der Tat wird die funktionelle Programmierung stark von beeinflusst von Kategoriestheorie.

Ausbildung

Viele Universitäten Lehren oder haben funktionale Programme als Teil ihrer unterrichtet Bachelor Informatik -Abschluss.[102][103][104][105] Einige nutzen es als Einführung in die Programmierung,[105] während andere es nach dem Unterricht nach einer imperativen Programmierung unterrichten.[104][106]

Außerhalb der Informatik wird die funktionale Programmierung als Methode zum Lehren von Problemlösungen, Algebra und geometrischen Konzepten verwendet.[107] Es wurde auch als Werkzeug verwendet, um die klassische Mechanik zu unterrichten Struktur und Interpretation der klassischen Mechanik.

Siehe auch

Verweise

  1. ^ Hudak, Paul (September 1989). "Konzeption, Evolution und Anwendung funktionaler Programmiersprachen" (PDF). ACM Computing -Umfragen. 21 (3): 359–411. doi:10.1145/72551.72554. S2CID 207637854.
  2. ^ a b Hughes, John (1984). "Warum funktionale Programmierungen wichtig sind".
  3. ^ a b Cler, Will (1987). "Multitasking und MacScheme". Mactech. 3 (12). Abgerufen 2008-08-28.
  4. ^ a b Harheimer, Anne (1987). "Programmieren eines Texteditors in MacScheme+Toolsmith". Mactech. 3 (1). Archiviert von das Original Am 2011-06-29. Abgerufen 2008-08-28.
  5. ^ a b Kidd, Eric. Terrorismus -Reaktionstraining im Schema. CUFP 2007. Abgerufen 2009-08-26.
  6. ^ a b Cleis, Richard. Schema im Weltraum. CUFP 2006. Abgerufen 2009-08-26.
  7. ^ a b "Wolfram Sprachhandbuch: Funktionales Programmieren". 2015. Abgerufen 2015-08-24.
  8. ^ "Funktional vs. prozedurale Programmiersprache". Abteilung für angewandte Mathematik. Universität von Colorado. Archiviert von das Original Am 2007-11-13.
  9. ^ "Statusbasiertes Scripting in Uncharted 2" (PDF). Archiviert von das Original (PDF) Am 2012-12-15. Abgerufen 2011-08-08.
  10. ^ a b "Wer nutzt Erlang für die Produktentwicklung?". Häufig gestellte Fragen zu Erlang. Abgerufen 2018-04-27.
  11. ^ a b Armstrong, Joe (Juni 2007). "Eine Geschichte von Erlang". Verfahren der dritten ACM -Sigplan -Konferenz über die Geschichte der Programmiersprachen. Dritte ACM -Sigplan -Konferenz über die Geschichte der Programmiersprachen. San Diego, Kalifornien. doi:10.1145/1238844.1238850. ISBN 9781595937667.
  12. ^ a b Larson, Jim (März 2009). "Erlang für die gleichzeitige Programmierung". Kommunikation der ACM. 52 (3): 48. doi:10.1145/1467247.1467263. S2CID 524392.
  13. ^ "Die Elixir -Programmiersprache". Abgerufen 2021-02-14.
  14. ^ a b Minsky, Yaron; Weeks, Stephen (Juli 2008). "CAML -Handel - Erfahrungen mit funktionaler Programmierung an der Wall Street". Journal of Functional Programming. 18 (4): 553–564. doi:10.1017/s095679680800676X. S2CID 30955392. Abgerufen 2008-08-27.
  15. ^ a b Leroy, Xavier. Einige Verwendungen von CAML in der Industrie (PDF). CUFP 2007. Abgerufen 2009-08-26.
  16. ^ a b "Haskell in der Industrie". Haskell Wiki. Abgerufen 2009-08-26. Haskell verfügt über eine Vielzahl von Verwendungsmöglichkeiten im Handel, von Luft- und Raumfahrt und Verteidigung über Finanzierung über Web -Startups, Hardware -Designfirmen und Rasenmäherhersteller.
  17. ^ a b c Hudak, Paul; Hughes, J.; Jones, S. P.; Wadler, P. (Juni 2007). Eine Geschichte von Haskell: faul im Unterricht zu sein. Dritte ACM -Sigplan -Konferenz über die Geschichte der Programmiersprachen. San Diego, Kalifornien. doi:10.1145/1238844.1238856. Abgerufen 2013-09-26.
  18. ^ a b Mansell, Howard (2008). Quantitative Finanzen in F#. CUFP 2008. Abgerufen 2009-08-29.
  19. ^ a b Peake, Alex (2009). Die erste wesentliche Geschäftsanwendung in F#. CUFP 2009. archiviert aus das Original am 2009-10-17. Abgerufen 2009-08-29.
  20. ^ Kommentare, 27. Juni 2017 Matt Banz Feed 603up 2. "Eine Einführung in die funktionale Programmierung in JavaScript". OpenSource.com. Abgerufen 2021-01-09.
  21. ^ "Der Benutzer! 2006 Konferenzplan enthält Papiere zur kommerziellen Nutzung von R". R-project.org. 2006-06-08. Abgerufen 2011-06-20.
  22. ^ Chambers, John M. (1998). Programmierung mit Daten: Ein Leitfaden zur S -Sprache. Springer Verlag. S. 67–70. ISBN 978-0-387-98503-9.
  23. ^ Novatchev, Dimitre. "Die funktionale Programmiersprache XSLT - ein Beweis durch Beispiele". Abgerufen 27. Mai, 2006.
  24. ^ Mertz, David. "XML -Programmierparadigmen (Teil vier): Die funktionale Programmierung wurde zur XML -Verarbeitung angesprochen". IBM Developerworks. Abgerufen 27. Mai, 2006.
  25. ^ Chamberlin, Donald D.; Boyce, Raymond F. (1974). "Fortsetzung: Eine strukturierte englische Abfragesprache". Verfahren des ACM Sigfidet von 1974: 249–264.
  26. ^ Funktionelle Programmierung mit C# - Simon Painter - NDC OSLO 2020, archiviert von das Original am 2021-10-30, abgerufen 2021-10-23
  27. ^ a b "Funktionale Programmierung - Kotlin -Programmiersprache". Kotlin. Abgerufen 2019-05-01.
  28. ^ Dominus, Mark J. (2005). Perl höherer Ordnung. Morgan Kaufmann. ISBN 978-1-55860-701-9.
  29. ^ Holywell, Simon (2014). Funktionelle Programmierung in PHP. PHP [Architekt]. ISBN 9781940111056.
  30. ^ The Cain Gang Ltd. "Python Metacklasse: Wer? Warum? Wann?" (PDF). Archiviert von das Original (PDF) am 30. Mai 2009. Abgerufen 27. Juni 2009.
  31. ^ "Gophercon 2020: Dylan Meeus - Funktionelle Programmierung mit Go". Youtube.com.{{}}: CS1 Wartung: URL-Status (Link)
  32. ^ "Funktionale Sprachmerkmale: Iteratoren und Verschluss - die Rost -Programmiersprache". doc.rustlang.org. Abgerufen 2021-01-09.
  33. ^ Vanderbauwhede, Wim. "Cleaner -Code mit funktionaler Programmierung". Archiviert von das Original Am 11. September 2020. Abgerufen 6. Oktober 2020.
  34. ^ "Effektive Scala". Scala Wiki. Abgerufen 2012-02-21. Effektive Scala.
  35. ^ "Dokumentation für Paket java.util.function seit Java 8 (auch bekannt als Java 1.8)". Abgerufen 2021-06-16.
  36. ^ Turing, A. M. (1937). "Berechnbarkeit und λ-Definierbarkeit". Das Journal of Symbolic Logic. Cambridge University Press. 2 (4): 153–163. doi:10.2307/2268280. JStor 2268280. S2CID 2317046.
  37. ^ Haskell Brooks Curry; Robert Feys (1958). Kombinationslogik. North-Holland Publishing Company. Abgerufen 10. Februar 2013.
  38. ^ Kirche, A. (1940). "Eine Formulierung der einfachen Theorie der Typen". Zeitschrift für symbolische Logik. 5 (2): 56–68. doi:10.2307/2266170. JStor 2266170. S2CID 15889861.
  39. ^ McCarthy, John (Juni 1978). Geschichte von Lisp (PDF). Geschichte der Programmiersprachen. Los Angeles, Kalifornien. S. 173–185. doi:10.1145/800025.808387.
  40. ^ John McCarthy (1960). "Rekursive Funktionen symbolischer Ausdrücke und ihre Berechnung nach Machine, Teil I." (PDF). Kommunikation der ACM. ACM New York, NY, USA. 3 (4): 184–195. doi:10.1145/367177.367199. S2CID 1489409.
  41. ^ Guy L. Steele; Richard P. Gabriel (Februar 1996). Die Entwicklung von Lispoly (PDF). In ACM/Sigplan zweite Geschichte der Programmiersprachen. S. 233–330. doi:10.1145/234286.1057818. ISBN 978-0-201-89502-5. S2CID 47047140.
  42. ^ Die Memoiren von Herbert A. Simon (1991),, Models meines Lebens S. 189-190 ISBN0-465-04640-1 behauptet, dass er, Al Newell und Cliff Shaw "... allgemein als Eltern der künstlichen Intelligenz [Field]" zum Schreiben bezeichnet werden. Logikheoretiker, ein Programm, das die Theoreme ausgewiesen hat Principia Mathematica automatisch. Um dies zu erreichen, mussten sie eine Sprache und ein Paradigma erfinden, das, retrospektiv betrachtete, funktionelle Programmierungen einbettet.
  43. ^ Backus, J. (1978). "Kann Programmierung vom von Neumann -Stil befreit werden ?: Ein funktionaler Stil und seine Algebra von Programmen". Kommunikation der ACM. 21 (8): 613–641. doi:10.1145/359576.359579.
  44. ^ R.M. Burstall. Entwerfen Sie Überlegungen für eine funktionale Programmiersprache. Eingeladener Papier, Proc. Infotech State of the Art Conf. "The Software Revolution", Kopenhagen, 45–57 (1977)
  45. ^ R.M. Burstall und J. Darlington. Ein Transformationssystem zur Entwicklung rekursiver Programme. Journal of the Association for Computing Machinery 24 (1): 44–67 (1977)
  46. ^ R.M. Burstall, D.B. Macqueen und D. T. Sannella. Hoffnung: Eine experimentelle Anwendungssprache. Proc. 1980 Lisp Conference, Stanford, 136–143 (1980).
  47. ^ "Entdecken Sie es einfacher entdecken () leichter!". OpenScad.
  48. ^ Peter Bright (13. März 2018). "Entwickler lieben trendige neue Sprachen, verdienen aber mehr mit funktionaler Programmierung". ARS Technica.
  49. ^ John Leonard (24. Januar 2017). "Der heimliche Aufstieg der funktionalen Programmierung". Computer.
  50. ^ Leo Cheung (9. Mai 2017). "Ist die funktionale Programmierung besser für Ihr Startup?". InfoWorld.
  51. ^ Pountain, Schwanz. "Funktionelle Programmierung wird altert". Byte.com (August 1994). Archiviert von das Original am 2006-08-27. Abgerufen 31. August, 2006.
  52. ^ a b "ISO/IEC JTC 1/SC 22/WG5/N2137". Internationale Standardisierungsorganisation. 6. Juli 2017. {{}}: Journal zitieren erfordert |journal= (Hilfe)
  53. ^ "Überarbeitet^6 Bericht über das algorithmische Sprachschema". R6rs.org. Abgerufen 2013-03-21.
  54. ^ "Überarbeitet^6 Bericht über das algorithmische Sprachschema - Begründung". R6rs.org. Abgerufen 2013-03-21.
  55. ^ Cler, William (1998). "Richtige Schwanzrekursion und Raumeffizienz". Proceedings der ACM Sigplan 1998 -Konferenz zum Entwurf und der Implementierung von Programmiersprachen - PLDI '98. S. 174–185. doi:10.1145/277650.277719. ISBN 0897919874. S2CID 16812984.
  56. ^ Baker, Henry (1994). "Nachteile sollten nicht seine Argumente, Teil II: Cheney auf dem M.T.A."
  57. ^ Turner, D.A. (2004-07-28). "Gesamtfunktionalprogrammierung". Zeitschrift für Universal Informatik. 10 (7): 751–768. doi:10.3217/JUCS-010-07-0751.
  58. ^ Die Implementierung funktionaler Programmiersprachen. Simon Peyton Jones, veröffentlicht von Prentice Hall, 1987
  59. ^ a b John Launchbury (1993). "Eine natürliche Semantik zur faulen Bewertung": 144–154. Citeseerx 10.1.1.35.2016. {{}}: Journal zitieren erfordert |journal= (Hilfe)
  60. ^ Robert W. Harper (2009). Praktische Grundlagen für Programmiersprachen (PDF). Archiviert von das Original (PDF) am 2016-04-07.
  61. ^ Huet, Gérard P. (1973). "Die Nichtentzündbarkeit der Vereinigung in Logik der dritten Ordnung". Informationen und Kontrolle. 22 (3): 257–267. doi:10.1016/s0019-9958 (73) 90301-x.
  62. ^ Huet, Gérard (September 1976). Auflösung d'Allations Dans des Langages d'Ordre 1,2, ... ω (Ph.D.) (in Französisch). Universität de Paris VII.
  63. ^ Huet, Gérard (2002). "Vereinigung höherer Ordnung 30 Jahre später" (PDF). In Carreño, v.; Muñoz, C.; Tahar, S. (Hrsg.). Proceedings, 15. Internationale Konferenz Tphol. Lncs. Vol. 2410. Springer. S. 3–12.
  64. ^ Wells, J. B. (1993). "Typabilität und Typprüfung in der Lambda-Kalkulus zweiter Ordnung sind gleichwertig und unentschlossen." Technik. Rep. 93-011: 176–185. Citeseerx 10.1.1.31.3590.
  65. ^ Leroy, Xavier (17. September 2018). "Der Compcert verifizierte Compiler".
  66. ^ Peyton Jones, Simon; Vytiniotis, Dimitrios; Weirich, Stephanie; Geoffrey Washburn (April 2006). "Einfacher Vereinigung basierender Typinferenz für GADTS". ICFP 2006: 50–61.
  67. ^ "OCAML -Handbuch". Caml.inria.fr. Abgerufen 2021-03-08.{{}}: CS1 Wartung: URL-Status (Link)
  68. ^ "Algebraische Datentypen". Scala -Dokumentation. Abgerufen 2021-03-08.
  69. ^ Kennedy, Andrew; Russo, Claudio (Oktober 2005). Verallgemeinerte algebraische Datentypen und objektorientierte Programmierung (PDF). Oopsla. San Diego, Kalifornien. ISBN 9781595930316. Archiviert von das Original (PDF) Am 2006-12-29. Zitatquelle
  70. ^ Hughes, John. "Warum funktionale Programmierungen wichtig sind" (PDF). Chalmers University of Technology.
  71. ^ Rein funktionale Datenstrukturen durch Chris Okasaki, Cambridge University Press, 1998, ISBN0-521-66350-4
  72. ^ L’Orange, Jean Niklas. "Polymatheia - Clojure's Persistent Vector verstehen, pt. 1". Polymatheia. Abgerufen 2018-11-13.
  73. ^ Newbern, J. "Alles über Monaden: Ein umfassender Leitfaden für die Theorie und Praxis der monadischen Programmierung in Haskell". Abgerufen 2008-02-14.
  74. ^ "Dreizehn Arten, eine Schildkröte zu betrachten". FF# zum Spaß und Gewinn. Abgerufen 2018-11-13.
  75. ^ Paulson, Larry C. (28. Juni 1996). ML für den Arbeitsprogrammierer. Cambridge University Press. ISBN 978-0-521-56543-1. Abgerufen 10. Februar 2013.
  76. ^ Spiewak, Daniel (26. August 2008). "Implementierung anhaltender Vektoren in Scala". Code Commit.
  77. ^ "Welche Programme sind am schnellsten?. Benchmarksgame.alioth.debian.org. Archiviert von das Original Am 2013-05-20. Abgerufen 2011-06-20.
  78. ^ Igor Pechtchanski; Vivek Sarkar (2005). "Unveränderlichkeitsspezifikation und ihre Anwendungen". Parallelität und Berechnung: Übung und Erfahrung. 17 (5–6): 639–662. doi:10.1002/cpe.853. S2CID 34527406.
  79. ^ "Kapitel 25. Profiling und Optimierung". Book.realworldhaskell.org. Abgerufen 2011-06-20.
  80. ^ Hartel, Pieter; Henk Müller; Hugh Glaser (März 2004). "Die funktionale C -Erfahrung" (PDF). Journal of Functional Programming. 14 (2): 129–135. doi:10.1017/s0956796803004817. S2CID 32346900.; David Mertz. "Funktionelle Programmierung in Python, Teil 3". IBM Developerworks. Archiviert von das Original Am 2007-10-16. Abgerufen 2006-09-17.(Teil 1, Teil 2)
  81. ^ "Funktionen - D Programmiersprache 2.0". Digital Mars. 30. Dezember 2012.
  82. ^ "Lua Inoffizielle FAQ (UFAQ)".
  83. ^ "Erstklassige Funktionen in Go - Die Go -Programmiersprache". golang.org. Abgerufen 2021-01-04.
  84. ^ Eich, Brendan (3. April 2008). "Popularität".
  85. ^ Van Rossum, Guido (2009-04-21). "Ursprünge von Pythons" funktionaler "Funktionen". Abgerufen 2012-09-27.
  86. ^ "Functools - Funktionen und Operationen höherer Ordnung und Operationen für aufrufbare Objekte". Python Software Foundation. 2011-07-31. Abgerufen 2011-07-31.
  87. ^ Skarsaum, Martin (2008). Die automatische Übersetzung eines großen objektorientierten Systems von SICs Java Port -Port von SmallTalk zu Java.
  88. ^ Gosling, James. "Schließungen". James Gosling: Auf der Java -Straße. Orakel. Archiviert von das Original Am 2013-04-14. Abgerufen 11. Mai 2013.
  89. ^ Williams, Michael (8. April 2013). "Java se 8 lambda schneller Start".
  90. ^ Bloch, Joshua (2008). "Punkt 15: Mutabilität minimieren". Effektiver Java (Zweite Ausgabe). Addison-Wesley. ISBN 978-0321356680.
  91. ^ "Object.Freeze () - JavaScript | Mdn". Entwickler.mozilla.org. Abgerufen 2021-01-04. Das Object.Freeze () -Methode friert ein Objekt ein. Ein gefrorenes Objekt kann nicht mehr geändert werden; Das Einfrieren eines Objekts verhindert, dass neue Eigenschaften hinzugefügt werden, die vorhandenen Eigenschaften entfernt werden, verhindert, dass die Aufzählbarkeit, Konfigurierbarkeit oder die Schreibfähigkeit bestehender Eigenschaften geändert wird, und verhindert, dass die Werte bestehender Eigenschaften geändert werden. Darüber hinaus verhindert das Einfrieren eines Objekts auch, dass sein Prototyp geändert wird. Freeze () gibt das gleiche Objekt zurück, das übergeben wurde.{{}}: CS1 Wartung: URL-Status (Link)
  92. ^ Wakeling, David (2007). "Funktionalprogrammierung von Tabellenkalkulation" (PDF). Journal of Functional Programming. 17 (1): 131–143. doi:10.1017/s0956796806006186. ISSN 0956-7968. S2CID 29429059.
  93. ^ Peyton Jones, Simon; Burnett, Margaret; Blackwell, Alan (März 2003). "Verbesserung der beliebtesten funktionalen Sprache der Welt: benutzerdefinierte Funktionen in Excel". Archiviert von das Original Am 2005-10-16.
  94. ^ Piro, Christopher (2009). Funktionelle Programmierung bei Facebook. CUFP 2009. archiviert aus das Original am 2009-10-17. Abgerufen 2009-08-29.
  95. ^ "SIM-Diasca: Ein groß angelegter diskreter Ereignis gleichzeitiger Simulationsmotor in Erlang". November 2011.
  96. ^ 1 Million ist so 2011 // WhatsApp-Blog, 2012-01-06: "Das letzte wichtige Stück unserer Infrasraht ist Erlang"
  97. ^ Momtahan, Lee (2009). SCALA bei EDF Trading: Implementierung einer domänenspezifischen Sprache für dieivativen Preisgestaltung mit Scala. CUFP 2009. archiviert aus das Original am 2009-10-17. Abgerufen 2009-08-29.
  98. ^ Graham, Paul (2003). "Die Durchschnittswerte schlagen". Abgerufen 2009-08-29.
  99. ^ Sims, Steve (2006). Aufbau eines Startups mit Standard -ML (PDF). CUFP 2006. Abgerufen 2009-08-29.
  100. ^ Laurikari, Ville (2007). Funktionelle Programmierung in der Kommunikationssicherheit. CUFP 2007. Abgerufen 2009-08-29.
  101. ^ Lorimer, R. J. (19. Januar 2009). "Live -Produktion Clojure -Anwendung angekündigt". Infoq.
  102. ^ "Funktionale Programmierung: 2019-2020". Abteilung für Informatik der Universität Oxford. Abgerufen 28. April 2020.
  103. ^ "Programmieren i (Haskell)". Imperial College London Department of Computing. Abgerufen 28. April 2020.
  104. ^ a b "Informatik BSC - Module". Abgerufen 28. April 2020.
  105. ^ a b Abelson, Hal; Sussman, Gerald Jay (1985). "Vorwort zur zweiten Ausgabe". Struktur und Interpretation von Computerprogrammen (2 ed.). MIT Press.
  106. ^ John Denero (Herbst 2019). "Informatik 61a, Berkeley". Abteilung für Elektrotechnik und Computerwissenschaften, Berkeley. Abgerufen 2020-08-14.
  107. ^ Emmanuel Schanzer von Bootstrap interviewt in der TV -Show Triangulation auf der Twit.tv Netzwerk

Weitere Lektüre

  • Abelson, Hal; Sussman, Gerald Jay (1985). Struktur und Interpretation von Computerprogrammen. MIT Press.
  • Cousineau, Guy und Michel Mauny. Der funktionale Ansatz zur Programmierung. Cambridge, UK: Cambridge University Press, 1998.
  • Curry, Haskell Brooks und Feys, Robert und Craig, William. Kombinationslogik. Band I. North-Holland Publishing Company, Amsterdam, 1958.
  • Curry, Haskell B.; Hindley, J. Roger; Seldin, Jonathan P. (1972). Kombinationslogik. Vol. II. Amsterdam: North Holland. ISBN 978-0-7204-2208-5.
  • Dominus, Mark Jason. Perl höherer Ordnung. Morgan Kaufmann. 2005.
  • Fellisen, Matthias; Findler, Robert; Flatt, Matthew; Krishnamurthi, Shriram (2001). So entwerfen Sie Programme. MIT Press.
  • Graham, Paul. ANSI Common Lisp. Englewood Cliffs, New Jersey: Prentice Hall, 1996.
  • MacLennan, Bruce J. Funktionelle Programmierung: Praxis und Theorie. Addison-Wesley, 1990.
  • O'Sullivan, Brian; Stewart, Don; Goerzen, John (2008). Real World Haskell. O'Reilly.
  • Pratt, Terrence W. und Marvin Victor Zelkowitz. Programmiersprachen: Design und Implementierung. 3. Aufl. Englewood Cliffs, New Jersey: Prentice Hall, 1996.
  • Salus, Peter H. Funktionale und logische Programmiersprachen. Vol. 4 von Handbuch der Programmiersprachen. Indianapolis, Indiana: Macmillan Technical Publishing, 1998.
  • Thompson, Simon. Haskell: Das Handwerk der funktionalen Programmierung. Harlow, England: Addison-Wesley Longman Limited, 1996.

Externe Links