Wenn wir den syntaktischen Zucker auf der Vorderseite und die Codegenerierung auf der Rückseite abziehen und vergleichen, was dazwischen passiert, wenn der Quellcode in einen laufenden Code für zwingende Sprachen wie C oder Java mit funktionalen Sprachen wie ML oder OCaml konvertiert wird, werden wir im Allgemeinen feststellen die folgenden Unterschiede in was, warum und wie.
Veränderlich gegen unveränderlich
Bei der funktionalen Programmierung werden in der Regel unveränderliche Werte verwendet, sodass wir uns keine Sorgen machen müssen, wenn sich ein Wert außerhalb unserer aktuellen Funktion ändert. Bei richtiger Anwendung werden alle Probleme im Zusammenhang mit Nebenwirkungen beseitigt .
Fokus: Daten versus Funktion.
Wenn man an eine zwingende Codierung denkt, denkt man zuerst an Datenstrukturen und dann an die Methoden, die sie benötigen. Wenn man mit funktionaler Programmierung arbeitet, denkt man zuerst an die benötigten Funktionen und stellt dann die benötigten Datentypen her . Die meisten Datentypen sind entweder Lazy List (Think Stream oder Infinite List) oder diskriminierte Gewerkschaften . Wenn die diskriminierte Vereinigung rekursiv ist, haben Sie sofort einen Baum oder eine Grafik erstellt, ohne den gesamten Laufcode schreiben zu müssen.
Generika / Parametrischer Polymorphismus
Dieser ist interessant, und wenn ich meine Fakten richtig habe, wurde er mit funktionaler Programmierung erfunden und dann in die imperative Programmierung übertragen. Wenn Sie Generika mögen, bedanken Sie sich bei den Designern der funktionalen Sprache.
Referenzielle Transparenz / Parallelisierung
Aufgrund der referenziellen Transparenz kann Funktionscode einfacher auf paralleles Rechnen portiert werden .
Funktion / Komposition höherer Ordnung
Da Funktionen neue Funktionen erstellen und Funktionen zurückgeben können, ist das Erstellen neuer Funktionen auf anderen Funktionen genauso einfach wie das Erstellen neuer Ausdrücke, anstatt ganz neue Methoden zu schreiben. Dies führt zu Morphismen, die sehr nützlich sind, wenn das Problem, das Sie lösen, mit Mathematik erklärt werden kann. Mit der funktionalen Programmierung ist es viel einfacher, Set-Transformationen durchzuführen, an SQL und Updates zu denken. Wie Wandering Logic feststellte, zeichnen sich hier funktionale Programmiersprachen aus.
Typisierung: Statisch versus Inferenz .
Da die Typen abgeleitet werden, anstatt vom Programmierer während des Schreibens festgelegt zu werden, können mehr Überprüfungen durchgeführt werden, um die Richtigkeit des Codes sicherzustellen, und häufig werden die Funktionen generisch gemacht, anstatt von einem festgelegten Typ zu sein.
Pattern Matching vs switch-Anweisung
Wenn Sie Matching mit diskriminierten Gewerkschaften kombinieren, wird Ihr Matching überprüft, um sicherzustellen, dass Sie jedes Ergebnis abgedeckt haben. Wie oft hatten Sie einen Laufzeitfehler, weil Sie einen Fall mit einer switch-Anweisung verpasst haben.