Dies ist eine theoretische Frage, aber nach vielen Jahren des Programmierens in einer "normalen" imperativen Technik, die ich hauptsächlich mit C ++ verwende, habe ich diese andere Welt des funktionalen Programmierens entdeckt, auf die ich zufällig gestoßen bin, als ich zufällig JavaScript gelernt habe.
Ich habe mich gefragt, ob Sie ein komplettes staatsorientiertes Programm technisch durch eine andere Implementierung ersetzen könnten, die rein funktional und ohne Status ist.
Es ist eine faszinierende Idee und ich muss zugeben, dass die funktionale Programmierung eine Klarheit und Eleganz aufweist, die mich wirklich umgehauen hat.
Antworten:
Kurze Antwort: ja. Laut Wikipedia wurde 1937 von Alan Turing die Äquivalenz der Lambda- Berechnung mit Turing-Maschinen als universelles Rechenmodell gezeigt. Das Rechenmodell einer Turing-Maschine ist das, woran Sie normalerweise denken, wenn Sie über imperative oder zustandsbehaftete Programmierung sprechen, und die Lambda-Berechnung ist eine mathematische Formalisierung der "reinen funktionalen Programmierung".
Es wird vermutet, dass jedes effektive Rechenmodell die gleichen Berechnungen durchführen kann wie eine Turing-Maschine und umgekehrt. Dies nennt man Church-Turing-These . Diese Vermutung kann jedoch aufgrund des mehr oder weniger intuitiven Begriffs "effektives Rechenmodell" nicht bewiesen werden (wird vielleicht in Zukunft jemand ein neues Modell erfinden?)
quelle
In jedem dynamischen System ist der "Zustand" das, was Ihre Gegenwart von Ihrer Vergangenheit beeinflusst oder beeinflusst Zukunft beeinflusst (der Zeitpfeil ist kein mathematisches Problem, sondern nur eine physikalische Einschränkung).
Ob Sie sich an etwas "erinnern" müssen oder was davon abhängt, was Sie getan haben, Sie haben einen Zustand.
Ein System ohne Zustand ist nicht "dynamisch": Es ist nur eine kombinatorische Funktion. Das mag keinen Zustand haben, aber um unterschiedliche Ergebnisse zu erzielen, muss ein Zustand irgendwie geliefert werden.
Abhängig von dem Rechenmodell, auf das Sie sich beziehen, kann ein Zustand nun explizit (in Form einer Variablen) oder implizit (in Form von "Rücksprungadressen") dargestellt werden.
wenn Sie dies tun, geben
fna(fnb(x))
Sie fnb einen Zustand, der wiederum einen Zustand für fna erzeugt. Dies liegt an der Tatsache, dass esx
existiert, bevor fnb aufgerufen wird (es kommt also aus seiner eigenen "Vergangenheit").Es geht nicht um "Staatsexistenz" oder "Staat existiert nicht". Es ist eine Angelegenheit von "Ich interessiere mich" oder "Ich nicht".
quelle
Zustand bedeutet die Fähigkeit, auf einen gegenwärtigen Reiz in einer Weise zu reagieren, die von vergangenen Reizen abhängt und nicht nur auf dem gegenwärtigen Reiz basiert.
Rein funktionale Programme sind nur Funktionen. Für praktische Anwendungen gibt das rein funktionale Programm also ein Paar (old_state * present_stimulus) und ein Paar (new_state * present_response) ein. Ein externer, zustandsbehafteter "Looper" wird benötigt, um auf den nächsten Stimulus zu warten und den Zustand zu verbreiten.
Ein rein funktionales Programm hat keinen eigenen Status und kann nicht direkt für praktische Anwendungen verwendet werden.
Somit kann kein zustandsorientiertes Programm durch eine andere Implementierung ersetzt werden, die rein funktional und ohne Zustand ist.
quelle
Sie können explizite veränderbare Zustände vermeiden, solange Sie nicht mit der Außenwelt interagieren müssen.
In JavaScript müssen Sie das Dom- oder das Window-Objekt ändern, damit Ihr Programm tatsächlich einen Effekt erzielt, der über die Auslastung der Prozessorzyklen hinausgeht. Diese APIs sind statusbehaftet. Aber ich nehme an, Sie könnten einen Wrapper erstellen, der die Dom- und Window-Objekte als Parameter an den JavaScript-Code übergibt und dann ein neues Dom / Window als Ausgabe erhält. Dies würde den JavaScript-Code vom veränderlichen Status isolieren.
Natürlich sind Sie immer noch unter Berufung auf Zustand, da die Browser - Fenster und DOM ist von Natur aus Stateful. Jede interaktive Anwendung ist von Natur aus statusbehaftet. Sie können den Code jedoch so strukturieren, dass der explizite Status minimiert wird.
Eine andere Frage ist, ob es eine gute Idee ist. Sogar Haskell, das von Natur aus eine reine funktionale Sprache ist, enthält die Monade 'state', mit der Sie einen veränderlichen Zustand simulieren können. Dies zeigt, dass ein expliziter veränderlicher Zustand manchmal wirklich ein wünschenswertes Muster ist.
quelle
Überlegen Sie, wie Sie eine "Zustandsmaschine" in einer Programmiersprache ohne Zustand implementieren würden.
Sie könnten es wahrscheinlich tatsächlich tun, aber Sie würden am Ende Funktionsnamen als Speicher verwenden. Am Ende sah der Gobblyday so aus:
quelle