Verzögerte Auswertung ist eine gemeinsame Eigenschaft von rein funktionalen Programmiersprachen Leistung zurückgewinnen ", es ist ganz einfach funktioniert, bewerten Sie nur einen Ausdruck, wenn Sie es brauchen. Betrachten wir zum Beispiel in Haskell
if x == 1 then x + 3 else x + 2
In strikter (eifrig) Bewertung, wenn in der Tat x gleich zwei ist, dann x + 3 ausgewertet und zurückgegeben, sonst x + 2, in Haskell, nicht so etwas geschieht, x + 3 wird nur zu dem Ausdruck zusammengesetzt, zum Beispiel, sagen, ich habe:
let x = if x == 1 then x + 3 else x + 2
Nun, das ich dann speichern Sie in einer variablen, aber was, wenn ich jemals nie jemals diese Variable verwenden, aufgrund einiger anderen conditionals hmm? Ich habe einen sehr teuren ganzzahligen Zusatz auf meiner CPU für nichts verschwendet. (okay, in der Praxis gewinnt man nicht, aber man bekommt die Idee mit größeren Ausdrücken)
Dann stellt sich die Frage, warum nicht alle Sprachen faul sind ?, naja, der einfache Grund ist der rein Funktionssprachen, Ausdrücke haben garantiert keine Nebenwirkungen. Wenn sie hätten, müssten wir sie in der richtigen Reihenfolge bewerten. Deshalb werden sie in den meisten Sprachen eifrig bewertet. In Sprachen, in denen Ausdrücke keine Nebeneffekte haben, besteht bei einer faulen Bewertung kein Risiko. Daher ist es eine logische Entscheidung, die Leistung zurückzugewinnen, die sie auf anderen Gebieten normalerweise verlieren.
Ein weiterer interessanter Nebeneffekt ist, dass if-then-else in Haskell ist wirklich eine Funktion des Typs Bool -> a -> a -> a
. In Haskell bedeutet dies, dass ein Argument vom Typ Boolean verwendet wird, ein anderer vom gleichen Typ, ein anderer vom selben Typ wie der erste, und dieser Typ wird erneut zurückgegeben. Sie müssen nicht in unendliche Evaluierung verschiedener Steuer Zweige laufen, weil Werte nur ausgewertet werden, wenn sie benötigt werden, die in der Regel am Ende des Programms ist es, wenn ein großer Ausdruck komponiert worden und dann für das Endergebnis ausgewertet wird, Verwerfen Alle Dinge, die der Compiler denkt, werden für das Endergebnis nicht benötigt. Wenn ich zum Beispiel einen sehr komplexen Ausdruck selbst teile, kann er einfach durch '1' ersetzt werden, ohne beide Teile zu bewerten.
Der Unterschied in Schema zu sehen ist, die traditionell streng ausgewertet wird, aber es ist ein fauler Variante Faule Scheme genannt, in Schema (display (apply if (> x y) "x is larger than y" "x is not larger than y"))
ein Fehler ist, weil if
keine Funktion ist, dann ist es eine spezielle Syntax (obwohl einige Syntax sagen nicht ganz in Scheme, da es nicht notwendigerweise alle Argumente auswertet, sonst würden wir keinen Speicher mehr haben, wenn wir beispielsweise versuchen würden, eine Fakultät zu berechnen. In Lazy Scheme funktioniert das gut, weil keines dieser Argumente überhaupt ausgewertet wird, bis eine Funktion das Ergebnis wirklich benötigt, damit die Auswertung fortgesetzt werden kann, wie zum Beispiel die Anzeige.
Ein Kommentar für die Down-Abstimmung? – Earlz
Sie stellen hier viele verschiedene Fragen: 1) Vorteile der faulen Bewertung, 2) Leistung, 3) wie es implementiert wurde. Ich würde empfehlen, diese in 3 separate Fragen aufzuteilen. – Juliet