Die IO
Monade in Haskell wird oft als Staatsmonade bezeichnet, in der der Staat die Welt ist. Ein Wert vom Typ IO a
monad wird also als so etwas wie angesehen worldState -> (a, worldState)
.
Vor einiger Zeit habe ich einen Artikel (oder einen Blog- / Mailinglisten-Beitrag) gelesen, in dem diese Ansicht kritisiert und verschiedene Gründe genannt wurden, warum sie nicht korrekt ist. Aber ich kann mich weder an den Artikel noch an die Gründe erinnern. Weiß jemand Bescheid?
Bearbeiten: Der Artikel scheint verloren zu sein, also wollen wir hier verschiedene Argumente zusammenfassen. Ich starte eine Prämie, um die Dinge interessanter zu machen.
Bearbeiten: Der Artikel, den ich gesucht habe, befasst sich mit der schwierigen Situation: monadische Ein- / Ausgabe, Parallelität, Ausnahmen und fremdsprachige Anrufe in Haskell von Simon Peyton Jones. (Dank der Antwort von TacTics.)
quelle
Antworten:
Das Problem dabei
IO a = worldState -> (a, worldState)
ist, dass wenn dies wahr wäre, wir das beweisen könntenforever (putStrLn "Hello") :: IO a
undundefined :: IO a
gleich sind. Hier ist der Beweis mit freundlicher Genehmigung von Dolio (2010, irc):Lemma:
(\r w -> r (snd $ m w)) ⊥ = ⊥
Deshalb
forever m = fix (\r -> \w -> r (snd $ m w)) = ⊥
Insbesondere
forever (putStrLn "Hello") = ⊥
und daherforever (putStrLn "Hello")
undundefined
sind gleichwertige Programme. Es ist jedoch klar, dass sie weder in der Theorie noch in der Praxis als gleichwertige Programme gelten.Beachten Sie, dass dieses Modell falsch ist, auch wenn keine Parallelität aufgerufen wird.
quelle
undefined
der reinen Semantik von Haskell entspricht? In Haskells reiner Semantik sollen verschiedene nicht zu unterscheiden sein! Aber wenn wir operativ über unsere Programme nachdenken, wollen wir auch dann verschiedene Arten von ⊥ unterscheiden, wenn diesIO
nicht involviert ist. Es ist mir egal, ob mein Programm eine Ausnahme auslöst oder in eine Endlosschleife eintritt, auch wenn Sie beweisen können, dass diese gleich sind, indem Sie beweisen, dass beide ⊥ sind. Das ist aber eigentlich kein Widerspruch.forever (putStrLn "Hello")
aber[0,1..]
sicher nicht so . Ihr Beweis ist nicht spezifischworldState
, deshalb gilt er auch für die reguläre Staatsmonade.forever (someModificationWith "Hello")
Ist also auch gleichbedeutend mit ⊥. Ich bin völlig überrascht von diesem Ergebnis; Es ist in der Denotationssemantik nicht produktiv, und was der Computer im Betrieb tut , während wir ewig warten, ist irrelevant. Gleiches fürforever (putStrLn "Hello")
; Es kann und sollte keinen neuen Weltstaat hervorbringen, den wir irgendwie träge konsumieren können.Hier ist eine triviale Antwort: Jede Änderung des Status der Staatsmonade ist auf Aktionen zurückzuführen, die in der Monade ausgeführt wurden. Wenn in der Tat die Erklärung "WorldState -> (a, WorldState)" dieselbe Eigenschaft beansprucht, wobei WorldState ein reiner Wert ist, den nur die E / A-Monade ändert, ist dies falsch. Zeitänderungen, der Inhalt von Dateien, der Status von Handles usw. können sich unabhängig davon ändern, was in der E / A-Monade geschieht. Das ist der Punkt der IO-Monade. Die Tatsache, dass GHC einen RealWorld-Wert umgibt (oder es war), soll garantieren, dass die Dinge, soweit ich weiß, in Ordnung sind (kann nur etwas sein, das in den ST-Wert eingefügt werden kann).
quelle
Ich schrieb einen Blogbeitrag zum Thema, wie IO als eine Form der asymmetrischen Coroutine modelliert werden kann, die mit dem Laufzeitsystem für Ihre Sprache kommuniziert. (Es ist zugegebenermaßen der dritte Teil einer Serie)
http://comonad.com/reader/2011/free-monads-for-less-3/
In diesem Beitrag geht es darum, warum es unangenehm ist, über die Semantik des "Weltvergehens" nachzudenken.
quelle
Siehe Bekämpfung der ungeschickten Truppe .
Der Hauptgrund dafür ist, dass RealWorld-Statusmodelle der E / A-Monade nicht gut mit Parallelität funktionieren. SPJ in diesem lesbaren Klassiker bevorzugt die Verwendung einer operativen Semantik, um dies zu verstehen.
quelle
Die Hauptbeschwerde bei den RealWorld-Zustandsmodellen ist, dass, wie TacTics sagt, die Weitergabe der Welt nicht unbedingt mit der Parallelität zusammenarbeitet. Aber Wouter Swierstra und Thorsten Altenkirch gezeigt , wie man Grund , sich über die Parallelität als „Welt-Passing“ -Effekt, mit einem Fest aber willkürlicher Reihenfolge Fäden der Verschachtelung in ihrem Papier „Schönheit im Biest: eine funktionelle Sematics für die ungeschickte Squad“: http : //www.staff.science.uu.nl/~swier004/Publications/BeautyInTheBeast.pdf
Der entsprechende Code befindet sich auf Hackage als IOSpec: http://hackage.haskell.org/package/IOSpec
Ich denke, Wouters These geht detaillierter: http://www.staff.science.uu.nl/~swier004/Publications/Thesis.pdf
quelle