2012-06-04 20 views
7

Ich verstehe wahrscheinlich die IO-Monade sehr gut.Haskell IO Monad und Speicher verwenden

Wenn ich eine Anwendung schreibe, die voraussichtlich für viele Monate läuft und währenddessen ihren Fortschritt protokolliert, wird die IO-Monade alle Protokollinformationen bis zum Ende im RAM halten?

Aus dem Blog auf IO Inside, Haskell-Modelle der Welt als

main :: RealWorld -> ((), RealWorld) 

so dass IO nicht während der Ausführung des Haskell Teil des Codes auftritt, aber nur, wenn die Anwendung kehrt von main.

Ich bin wahrscheinlich völlig falsch interpretieren. Könnte jemand erklären, , wenn Haskell tatsächlich IO?

Antwort

8

wird die IO-Monade alle Protokollinformationen im RAM bis zum Ende halten?

Nein. Sie sollten nicht die "IO-Monade" als etwas betrachten, das Aktionen ausführt. Es ist nur eine mathematische Art, imperative Programme darzustellen. Die primitiven imperativen Programme sind Dinge wie getChar; >>= wird verwendet, um zwei Programme zu einem größeren imperativen Programm zusammenzufügen. Die IO-Monade ist die Menge aller imperativen Programme.

Betrachten wir ein Programm wie

main = putStr "Hello, " >> putStrLn "world!" 

Das bedeutet: main ein Programm ist, dass das Programm putStr "Hello, " ausführt, und wenn dies geschehen ist, führt das Programm putStrLn "world!". Es gibt keine Notwendigkeit für den Haskell-Interpreter oder das kompilierte Programm, irgendeinen Zustand im Speicher zu behalten, außer für einen Befehlszeiger, d. H. "Wo sind wir und was werden wir als nächstes ausführen". Die RealWorld -> ((), RealWorld) Metapher könnte Sie verwirrt haben, da sie eine Umwandlung des Zustands der Außenwelt in einen neuen Zustand impliziert, der in seiner Gesamtheit berechnet werden muss, wonach die Welt aktualisiert werden kann, um den berechneten Zustand widerzuspiegeln. Das passiert überhaupt nicht. Das Haskell-Wiki warnt davor:

Die folgende Geschichte über IO ist insofern falsch, als es einige wichtige Aspekte von IO (einschließlich Interaktion und Nebenläufigkeit) nicht wirklich erklären kann.

+0

Danke für die nette Erklärung. Ich habe "Learn You a Haskell" gelesen (derzeit in meiner zweiten Lesung der Monaden) und habe "Real-World Haskell" gestartet. Wenn ich etwas nicht verpasse, macht keiner klar, dass IO sofort auftritt, sondern wie andere Monaden bis zum Ende "akkumuliert" wird.Ich denke, ich muss mir die Assemblerausgabe des Compilers ansehen, um mich zu überzeugen :-). – Ralph

+0

Die Metapher 'RealWorld -> ((), RealWorld) scheint sicher zu implizieren, dass die Transformation in einer reinen Form abläuft und erst am Ende in ihrer Gesamtheit ausgestrahlt wird. Ich denke, die zugrundeliegenden Implementierungen der IO-Operationen finden tatsächlich "on demand" statt. – Ralph

+5

@Ralph: Der Schlüssel zum Verständnis der IO-Monade ist, dass es * Programme * sammelt, nicht tatsächliche Eingabe und Ausgabe. Wenige Haskell Tutorials erklären das gut. –

4

speichert die IO-Monade alle Protokollinformationen im RAM bis zum Ende?

Nein. Angenommen, Sie verwenden eine vernünftige Protokollierungsstrategie.

Haskell führt IO durch, wenn das Ergebnis von Ihrem Programm angefordert wird; was für die meisten Aktionen sofort ist. (Die Ausnahme sind faule Dateieingabebibliotheken, in denen Dateien nicht unbedingt gelesen werden, bis die Daten vom Programm verwendet werden).