Ist das eine vernünftige Sicht auf Haskell IO?
Wenn ein Haskell Runtime ein Programm bekommt, macht es folgendes:
main
auf, um eine "IO-Berechnung" Dieser zweistufige Ansatz erlaubt main
, eine reine Funktion zu bleiben.
Eine IO-Berechnung ist in diesem Fall wie eine spezielle Version von Haskell, die eine explizite Sequenzierung hat - oder vielleicht gibt es eine bessere Möglichkeit, dies zu beschreiben?
Ja, das ist ein anständiges semantisches Modell, wie die Programme ausgeführt werden. Die Implementierung funktioniert natürlich nicht so, aber Sie können dieses Modell immer noch verwenden, um über die Programme nachzudenken.
Aber im Allgemeinen erlaubt IO
Ihnen, imperative Programme als reine Werte zu behandeln. Mit den Operationen Monad
können Sie dann imperative Programme aus kleineren imperativen Programmen zusammenstellen (oder den üblichen Ausdruck in diesem Kontext verwenden, Aktionen ) und reine Funktionen. So kann das rein funktionale Modell, obwohl es imperative Programme nicht ausführen kann, diese immer noch als Ausdrücke des Typs IO a
beschreiben, und der Compiler kann diese Beschreibungen in imperativen Code übersetzen.
Oder Sie könnten das sagen:
main
. Das heißt, der Teil "evaluate main
" Ihres Modells wird an den Compiler gesendet und befindet sich nicht in der Laufzeit, wie Sie es zuerst beschreiben.
Ihre Ansicht von IO
ist gut, aber ich habe ein Problem mit dieser Zeile
Ruft main auf, um eine "IO-Berechnung" zurück zu bekommen
Der beste Weg, um über Haskell nachzudenken, ist, dass Funktionen nichts tun . Stattdessen beschreiben Sie deklarativ, welche Werte sind . Ein Programm besteht aus einer Beschreibung eines IO
Wertes namens main
. Der einzige Sinn, zu dem es "Main" aufruft, ist, dass die Deklaration von main
auf Weak Head Normal Form (oder etwas Ähnliches) reduziert wird.
IO
ist die Art von beliebigen Berechnungen mit Nebeneffekten. Die reine Teilmenge von Haskell ist eine rein deklarative Beschreibung von Werten, die zufällige Beschreibungen erlaubt. Denken Sie an Haskell als eine mathematische Sprache wie die Mengenlehre. Aussagen in der Mengenlehre tun nichts, aber sie können komplizierte Berechnungen wie "die kleinste Menge, die Akerman's_function (30) enthält" beinhalten. Sie können auch unentscheidbare Aussagen enthalten wie "S = die Menge aller Mengen, die sich nicht selbst enthalten"
@amindfv ist halb rechts: main
ist keine "reine Funktion". Es ist überhaupt keine Funktion. Es ist ein Wert, der durch eine reine Reduktion definiert wird und für die Berechnung der Unpünktlichkeit steht.