Ist das eine vernünftige Sicht auf Haskell IO?

7

Ist das eine vernünftige Sicht auf Haskell IO?

Wenn ein Haskell Runtime ein Programm bekommt, macht es folgendes:

  1. Ruft main auf, um eine "IO-Berechnung"
  2. zu erhalten
  3. Es führt dann diese Berechnung aus oder "läuft" sie, wodurch alle Nebeneffekte ausgeführt werden, die die Berechnung enthält.

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?

    
ErikR 23.02.2012, 23:47
quelle

2 Antworten

12

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:

  • Der Compiler (nicht die Laufzeit) wertet main .
  • aus
  • Das Ergebnis dieser Bewertung ist ein imperatives Programm.
  • Dieses Programm wird in der ausführbaren Zieldatei gespeichert.
  • Sie führen dann das Zielprogramm aus.

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.

    
Luis Casillas 23.02.2012, 23:59
quelle
6

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.

    
Philip JF 24.02.2012 00:12
quelle

Tags und Links