Hat jemand ein gutes mentales Modell oder eine Metapher für funktionale Programmierung, die sich auf etwas in der realen Welt bezieht?
Objektorientiertes Programmieren macht für mich intuitiv Sinn. Es gibt Dinge, die Eigenschaften haben, und manchmal können sie auch Dinge tun oder Berechnungen an ihren Eigenschaften (Methoden) durchführen. (Bsp .: Auto, Form, Katze).
Ich trage funktionale Programmierung und bin nicht an einer Debatte über die Tugenden der beiden interessiert. Ich brauche nur eine Metapher oder ein mentales Modell, um damit zu arbeiten, wie ich es bei der objektorientierten Programmierung getan habe.
Was sind gute mentale Modelle oder reale Metaphern für die Programmierung in einem funktionalen Paradigma? Es gibt etwas an Funktionen, die aus Funktionen bestehen, die Funktionen verarbeiten, und die einen keinen festen Platz zum Stehen und Nachdenken lassen.
quelle
Antworten:
Bei der funktionalen Programmierung geht es darum, kleinere Funktionen zusammenzukleben, um Ihre Ergebnisse zu erzielen. Ein anständiges mentales Modell (zumindest für mich) ist ein Fließband. Jede Funktion, die zusammengestellt wird, ist ein weiterer Schritt im Montageprozess. Betrachten Sie diese Funktion hier:
In Haskell gibt diese Funktion das kleinste Element in einer Liste zurück. Die Fertigungslinie sortiert zuerst die Eingabe und gibt dann das erste Element zurück (vorausgesetzt, es wird vom kleinsten zum größten Element sortiert). Wenn wir nur den kleinsten geraden Wert erhalten möchten, können wir die Fertigungslinie folgendermaßen ändern:
Es ist nur noch ein Schritt auf dem Förderband.
Kurz gesagt, beschreiben Funktionen nur die Schritte, die unternommen wurden, um den Roh-Input (die Teile) in das verarbeitete Gut (den Output) umzuwandeln.
quelle
(f . g) (x)
Mittelf(g(x))
oder dief . g
Mittel schreiben\x -> f (g (x))
..
definiert ist. So funktioniert Haskell im Allgemeinen nicht . Sie könnten genauso gut den Forward-Pipe-Operator (|>
) von F # in Haskell definieren und schreiben,smallest x = (sort x) |> head
und die Daten würden richtig fließen. Ich dachte nur, ich würde darauf hinweisen.Mathematik. Die funktionale Programmierung ist von der Mathematik inspiriert und an diese angelehnt. Mathematische Funktionen haben keinen Zustand, keine Nebenwirkungen usw., und so ist es auch mit FP. Wenn Sie über FP in Bezug auf mathematische Funktionen nachdenken, anstatt einen OO-ähnlichen Ansatz zu verwenden, sind Sie in guter Verfassung. Wenn Sie versuchen, FP mit OO-Sensibilität zu versorgen, schwimmen Sie gegen den Strom.
quelle
Wie wäre es mit einem Daumenkino ?
In einem Daumenkino repräsentiert jede Seite die Welt, wie sie zu einem bestimmten Zeitpunkt existiert. In unserem Programm wird die Welt als eine zusammengesetzte Datenstruktur dargestellt (z. B. haben wir eine Banane, die in der Hand eines Gorillas liegt, der sich in einem Baum befindet, der sich in einem Dschungel befindet). Jede nachfolgende Seite erweitert die Story, indem die vorherige Darstellung leicht geändert wird. In FP wurden persistente Datenstrukturen entworfen, um vorherige Strukturen effizient wiederzuverwenden, sodass eine Änderung nur ein Delta und keine vollständig neue Wiedergabe bereitstellt.
Was möglicherweise nicht offensichtlich ist, ist, dass eine Seite in unserem Daumenkino auch immaterielle Werte darstellen würde. Wenn der Gorilla zum Beispiel die Banane fallen lässt, können wir damit beginnen, die Auswirkungen der Schwerkraft auf seine Anständigkeit und Beschleunigung in Richtung des Dschungelbodens anzuwenden. Um dem entgegenzukommen, würden wir unserer Banane Attribute wie Geschwindigkeit und Flugbahn hinzufügen.
In unserem Programm gibt es eine Funktion, die eine Flipbook-Seite (alias den Zustand der Welt) als Argument akzeptiert und eine neue Seite liefert . Auf diese Weise wird unsere Geschichte erzählt, ohne den Zustand bestehender Objekte zu verändern. Wir ersetzen einfach jede Seite durch eine neuere, wobei eine effektive Berechnung verwendet wird.
quelle
Beziehungen.
Freund: Bei zwei Personen folgt eine Freundschaft diesen allgemeinen Gesetzen
Monoid: Bei mehreren Elementen und einer Funktion, die 2 der Elemente annimmt und 1 zurückgibt, folgt eine monoidale Beziehung diesen allgemeinen Gesetzen
Bei der funktionalen Programmierung dreht sich alles um Verallgemeinerungen. Friend ist eine sehr allgemeine Beziehung, die in zahlreichen Szenarien zu sehen ist, aber in allen verschiedenen Formaten folgt sie im Allgemeinen den obigen Gesetzen.
Wenn Sie die Gesetze kennen, die die Beziehungen zwischen Dingen regeln, können Sie allgemeine Implementierungen erstellen, die auf jedem Format von Dingen mit dieser Art von Beziehung funktionieren. In der funktionalen Programmierung versuchen Sie, die Beziehungen zwischen Dingen zu identifizieren, damit sie allgemein klassifiziert und behandelt werden können.
Sie möchten eine Metapher aus der realen Welt? Sehen Sie sich an, wie die Dinge zusammenhängen, und versuchen Sie, allgemeine Gesetze zu ermitteln (wie in mehreren Szenarien, in denen andere als die Gesetze variieren können). Es gibt eine Beziehung zwischen einem Kassierer und einem Käufer in einem Geschäft, es gibt einige allgemeine Gesetze, Software wurde entwickelt, um die Ziele von Personen in dieser allgemeinen Beziehung in Bezug auf POS-Systeme zu erleichtern. Auf ähnliche Weise können Sie sich beim Schreiben Ihrer Software auf die Gesetze dieser Beziehungen verlassen, anstatt auf die spezifischen Einzelheiten einer Beziehungsinstanz, wenn Sie feststellen, dass diese allgemeinen Gesetze die Zusammenhänge bestimmen.
quelle
Alles ist ein Wert, und Sie wenden Funktionen auf Werte an (dies können Funktionen sein), um neue Werte zu erzeugen, vorzugsweise ohne Nebenwirkungen.
quelle
Das Wichtigste bei der funktionalen Programmierung ist, dass alles ein Wert ist - selbst der Code selbst ist 'Werte'.
Das beste Beispiel für eine einfache funktionale Programmierumgebung ist das von allen bevorzugte Geschäftstool - die Tabellenkalkulation. Jede Zelle in der Tabelle enthält entweder Daten oder das Ergebnis einer Funktion. Darüber hinaus kann diese Funktion keine andere Zelle ändern.
Wenn man zu einer funktionalen Sprache wechselt , haben die Funktionen anstelle eines kartesischen Gitters aus
A1
undB42
Namen. Das ist alles was es wirklich ist.Es gibt andere Aspekte, die man darüber hinaus hinzufügen kann ... aber das ist die funktionale Programmierung im Kern. Man muss sich keine Gedanken über die Struktur von Listen oder die Gruppierung von Dingen machen. Bei der funktionalen Programmierung geht es darum, einen Wert an eine Funktion zu übergeben und einen Wert zurückzugewinnen, ohne irgendwo anders im Speicher herumzuspielen.
Das ist es. Funktionale Programmierung ist eine Tabellenkalkulation mit Namen anstelle eines Rasters.
quelle
Sie können sich funktionale Programmierung als Verhalten vorstellen . Ein Programm ist eine Beschreibung des Verhaltens, das der Computer ausführen soll. Funktionen sind die Grundeinheit des Verhaltens, und die Funktionszusammensetzung ist eine Möglichkeit, aus kleineren Verhaltensweisen größere Verhaltensweisen zu erstellen.
In OOP wird ein Codeobjekt soll sein , den Zustand eines Objekts in dem Problembereich; Sie ändert sich mit der Zeit, um Änderungen in diesem Domänenobjekt widerzuspiegeln. In FP steht ein Wert für den Status eines Domänenobjekts. es ändert sich nie, Sie erstellen einfach unterschiedliche Werte, um unterschiedliche Zustände darzustellen.
Ich finde das Funktionsmodell ein bisschen ehrlicher, was Computer tatsächlich tun - darstellen. Schließlich kann ich nicht einfach etwas
new Tesla()
aus der Luft zaubern . :)quelle
Sätze sind funktionaler als objektorientiert, vorausgesetzt, Sie unterteilen sie mehr oder weniger wie folgt ...
Also müssen wir die Hauptsätze und dann den Rest finden:
Auf einmal:
Baum analysieren:
Sparsamkeit beeinflusst das funktionale Denken;
Hut ab vor Gottlieb Frege aus den 1890er Jahren, Alan Turing (entschiedungsprobleme) aus den 1930er Jahren, Noam Chomsky (1960er Jahre).
quelle