Diese Frage ergibt sich aus der Frage /software/25569/is-haskell-worth-learning
Im Allgemeinen werden einige häufig wiederholte Aussagen darüber gemacht, wie Haskell Ihre Codierungsfähigkeiten in anderen Sprachen verbessert, und außerdem, weil Haskell zustandslos ist, und das ist eine gute Sache.
Warum?
Ich habe gesehen, dass jemand dies damit vergleicht, nur mit der linken Hand zu tippen oder vielleicht für einen Tag die Augen zu schließen und sich nur auf die Berührung zu verlassen. Da steckt doch mehr dahinter?
Bezieht es sich auf den Hardware-Speicherzugriff oder auf etwas anderes, das einen großen Leistungsgewinn darstellt?
Antworten:
Es gibt mindestens drei große Vorteile auf den ersten Blick:
Dadurch werden Programme mathematischen Ausdrücken näher gebracht. In der Mathematik
x
ändert sich nichts, Sie wissen nur nicht, was es ist, bis Sie die Gleichung lösen.Am Ende kommt es zu einer Zustandsänderung (immerhin funktioniert der Computer so auf niedriger Ebene). aber es ist durch die Sprache auf bestimmte Orte beschränkt. Dadurch hat der Compiler große Möglichkeiten, Code zu verschieben, um ihn zu optimieren, da er weiß, dass er nichts ändert, von dem anderer Code abhängt.
Der gleichzeitige Code muss nicht synchronisiert werden, um auf sich nicht ändernde Daten zuzugreifen. Daher wird die Parallelität sowohl in SMP-Shared-Memory-Systemen (alle Multicore-Systeme von heute) als auch in lose verbundenen Clustern verbessert.
quelle
Hier ist ein weiterer Vorteil: Reduzierte Kopplung. Wenn Sie Code haben wie:
und woanders hast du:
dann sind die beiden Funktionen implizit abhängig . Es gibt keine einfache Möglichkeit, festzustellen, dass Anrufe
doStuff
von Anrufen betroffen sinddoOtherStuff
. Ohne veränderlichen Zustand müssten Sie die Verbindung explizit machen.Natürlich ist dies kein Problem bei allen veränderlichen Zuständen , sondern bei allen durchdringenden veränderlichen Zuständen. Die wirkliche Lösung besteht darin, standardmäßig unveränderlich zu sein und den veränderlichen Zustand auf eine Art und Weise zu "markieren" und ihn auf den gewünschten Ort zu beschränken.
quelle
Eine vereinfachte Antwort lautet: Wenn Sie einen Namen in einer rein funktionalen Sprache sehen, wissen Sie, was der zugehörige Wert ist, indem Sie seine Definition einfach nachschlagen. Wenn Sie veränderbare Variablen haben, können Sie nur anhand der zuletzt ausgeführten Zuweisungen feststellen, welche der verschiedenen Zuweisungen zuletzt ausgeführt wurden. Daher müssen Sie auch den Kontrollfluss analysieren, der wiederum von bestimmten Bedingungen abhängig sein kann, sodass Sie mehrere Möglichkeiten haben. Um eine exponentielle Explosion zu erhalten, müssen Sie lediglich berücksichtigen, dass die RHS der Zuweisungen selbst von Variablen abhängig sind, und sie müssen daher auch rekursiv analysiert werden.
Das Fazit der obigen Analyse ist, dass es unhaltbar ist, wenn keine Kommentare zu Absicht, Invarianten und Semantik abgegeben werden: Diese können schwer zu interpretieren sein und es kann schwierig sein zu überprüfen, ob die Semantik im tatsächlichen Code eingehalten wird.
Diese Antwort ist im Grunde eine Erweiterung von @ Javiers Punkt 1.
Ich denke, es ist auch eine Erklärung für die Popularität des betrügerischen OO-Regimes: Bei OO ist der veränderbare Zustand eingekapselt, was die Analyse erheblich erleichtert, indem die Mutationen zu einem gewissen Grad lokalisiert werden und eine wesentlich robustere Darstellung und Verifizierung der Semantik ermöglicht wird.
In Anbetracht dessen ist funktionale Programmierung nicht die Antwort. Die richtige Antwort ist ein System, das sowohl induktive (funktionale) als auch koinduktive (prozedurale) Programmierung unterstützt, sodass die richtigen Tools sowohl für die zustandslose als auch für die zustandsbehaftete Programmierung geeignet sind. Es ist nur so, dass die konstruktive (funktionale) Theorie gut etabliert ist, während die Theorie des Staatsmanagements noch in den Kinderschuhen steckt.
quelle
Als Autor von Siege , einem in Haskell geschriebenen DBMS, kann man meinen Standpunkt zu einem Konflikt zwischen veränderlichem Zustand bezeichnen. Ich hoffe es anders zu zeigen.
Der Zweck des veränderlichen Status ist es, den aktuellen Status eines Systems zu beschreiben. Angenommen, Sie haben ein Blog und es ist ein Backend einer Datenbank. In der Datenbank werden die Posts beschrieben, die Sie zum Zeitpunkt der Abfrage in Ihrem Blog haben es. Wie viele Posts gibt es gerade?
Vergleichen Sie dies mit einem unveränderlichen Zustand, der zur Vermittlung von Fakten verwendet wird. Wie viele Posts gab es am 12. August?
Tatsachen sind leicht zu überlegen, veränderlicher Zustand nicht. Der wandelbare Zustand ist jedoch kein böser, unreiner Effekt, der aus unseren Gedanken verbannt werden sollte. Wir brauchen es oft, um in der veränderlichen Welt, in der wir leben, koexistieren zu können. Wir müssen es nur sparsamer einsetzen.
quelle