Der Haupteinsatz bestand darin, Funktionen in Funktionen höherer Ordnung wie Filter und Map (Where und Select in .Net) zu übergeben. Dies ist wirklich der größte Effekt, der Dinge wie Set-Operationen nur einmal und dann Dinge, die eingreifen, beschreibt oder modifiziere Sätze.
So Dinge wie
%Vor%statt
%Vor%Ich finde es viel einfacher, Multi-Thread-Code jetzt zu schreiben.
Ich habe tendenziell weniger Variable auf Klassenebene als zuvor.
Ich habe auch Schnittstellen, die funktional unabhängig sind ... wieder hat das einen großen Gewinn, wenn es um Multithreading geht, da es die Menge der erforderlichen Objektverriegelung stark reduzieren kann, vorausgesetzt, dass Ihre Threads auch funktional unabhängig sind.
>Ich neige auch dazu, Albträume über schließende Klammern zu haben, die mich verfolgen.
Zwei Dinge kommen mir in den Sinn, die aus funktionaler Programmierung stammen, die ich anwende:
Nachdem ich einen guten Teil von Haskell geschrieben habe, ist es für mich viel einfacher, Linq zu SQL in meinem C # -Code zu verwenden.
Ich lehne mich nun stark darauf ab, Code zu schreiben, der ein Ergebnis annimmt und ein Ergebnis zurückgibt, anstatt eine Variable als Nebeneffekt zu ändern.
Ich habe große Teile des prozeduralen und funktionalen Codes geschrieben, was es für mich einfacher macht, meinen Code in kleinere Stücke einzuteilen, die eher der eine oder der andere Stil sind. Als ich nur prozedurale / oop Programmierung kannte, hatte ich weniger Werkzeuge in meiner mentalen Toolbox.
Das Lesen von Bibliotheksquellen in Haskell hat mir gezeigt, wie ich meinen Code besser aufkochen kann, um Abstraktionen von der eigentlichen Aufgabe zu trennen.
Ich habe viel vom Schreiben von Haskell gewonnen!
In gewisser Weise fiel mir auf, wie sehr ich unbewusst die Programmierung von funktionalem Stil benutzt hatte, ohne es für das zu erkennen, was es war.
Zum Beispiel verwende ich in Java häufig Konstrukte in Commons-Sammlungen wie Transformer und Predicate, die im Wesentlichen als Closures, aber als Java-Interfaces implementiert sind. Sie verwenden dann die bereitgestellten Dienstprogrammfunktionen zum Transformieren und Filtern von Elementen in einer Sammlung. Dies widerspricht der "standardmäßigen" imperativen Vorgehensweise in Java.
Dies sind natürlich Funktionen und Filterfunktionen von Vanille, aber ich hatte sie instinktiv benutzt, ohne zu wissen, was es war. Das deutet darauf hin, dass der funktionale Stil in hohem Maße intuitiv ist, auch wenn man nicht darüber informiert wird.
Ich finde, dass die Verschiebung von Python 3.x zu Iteratoren für mich sehr natürlich ist, weil es mich an Haskells faule Auswertung erinnert.
Ganz gleich, ob Sie Python 2.x oder Python 3.x verwenden, listen Sie die Comprehensions auf , < a href="http://docs.python.org/3.0/library/functions.html#map"> map
, itertools
, operator
und (zu einem etwas weniger umfangreich) functools
, sind meine Freunde!
Da die funktionale Programmierung orthogonal zur OOP ist, hat sie mir wirklich die Augen geöffnet, wie ich meine Klassen strukturiere.
Funktionale Programmierung und OO sind keine disjunkten Konzepte. Ein Mangel in den funktionalen Sprachen, den ich sehe, ist ihr Mangel an ADT Ausdruckskraft. Das Nächste, was ich der funktionalen Programmierung in einer OO-Sprache gesehen habe, ist Eiffel. Durch Konvention Funktionen sind referentiell transparent, es wäre ideal, wenn dies erzwungen würde.
Ich habe ein bisschen darüber in
geschriebenWie wirkt sich funktionale Programmierung auf die Struktur Ihres Codes aus?
Einige sind F # -spezifisch, aber es gibt viele allgemeine Beobachtungen dort.
Tags und Links functional-programming