IO
Monada w Haskell jest często tłumaczyć jako monady stan, w którym państwo jest świat. Zatem wartość typu IO a
monada jest postrzegana jako coś w rodzaju worldState -> (a, worldState)
.
Jakiś czas temu przeczytałem artykuł (lub wpis na blogu / liście mailowej), który skrytykował ten pogląd i podał kilka powodów, dla których jest on nieprawidłowy. Ale nie pamiętam ani artykułu, ani powodów. Ktoś wie
Edycja: Artykuł wydaje się zagubiony, zacznijmy więc gromadzić tutaj różne argumenty. Zaczynam nagrodę, aby uczynić rzeczy bardziej interesującymi.
Edycja: Artykuł, którego szukałem, dotyczy walki z niezręczną drużyną: monadyczne wejście / wyjście, współbieżność, wyjątki i rozmowy w języku obcym w Haskell przez Simona Peytona Jonesa. (Dzięki odpowiedzi TacTics.)
źródło
Odpowiedzi:
Problem
IO a = worldState -> (a, worldState)
polega na tym, że gdyby to była prawda, moglibyśmy to udowodnićforever (putStrLn "Hello") :: IO a
iundefined :: IO a
być równi. Oto dowód dzięki uprzejmości dolio (2010, irc):Lemat:
(\r w -> r (snd $ m w)) ⊥ = ⊥
W związku z tym
forever m = fix (\r -> \w -> r (snd $ m w)) = ⊥
W szczególności,
forever (putStrLn "Hello") = ⊥
a zatemforever (putStrLn "Hello")
iundefined
są równoważne programy. Oczywiście nie należy ich uważać za równoważne programy, zarówno w teorii, jak iw praktyce.Zauważ, że ten model jest zły nawet bez wywoływania współbieżności.
źródło
undefined
czystej semantyce Haskella? Różne setyki Haskella powinny być nierozróżnialne! Ale kiedy myślimy operacyjnie o naszych programach, chcemy rozróżnić także różne rodzaje ⊥, nawet jeśliIO
nie jest to zaangażowane; Obchodzi mnie to, czy mój program zgłasza wyjątek czy wchodzi w nieskończoną pętlę, nawet jeśli możesz udowodnić, że są one równe, udowadniając, że oba są ⊥. To jednak nie jest sprzeczność.forever (putStrLn "Hello")
nie jest tak[0,1..]
. Twój dowód nie jest konkretnyworldState
, dlatego dotyczy on również zwykłej monady państwowej. Więcforever (someModificationWith "Hello")
jest również denotacyjnie równoważny z ⊥. Jestem całkowicie zaskoczony tym wynikiem; nie jest produktywny w semantyce denotacyjnej, a to, co komputer robi operacyjnie, gdy czekamy wiecznie, jest nieistotne. To samo dotyczyforever (putStrLn "Hello")
; nie tworzy i nie powinien tworzyć nowego stanu świata, który możemy w jakiś sposób leniwie konsumować.Oto banalna odpowiedź: każda zmiana stanu monady stanu jest spowodowana działaniami podejmowanymi w monadzie. Jeśli rzeczywiście wyjaśnienie „WorldState -> (a, WorldState)” zawiera tę samą właściwość, a WorldState jest czystą wartością, którą zmieniają tylko monada IO, to jest źle. Zmiany czasu, zawartość plików, stan uchwytów itp. Mogą się zmieniać niezależnie od tego, co dzieje się w monadzie IO. O to chodzi w monadzie IO. Fakt, że GHC przekazuje poniżej wartość RealWorld (lub w / e to było) pod spodem, gwarantuje, że wszystko działa w porządku, o ile mi wiadomo, jeśli to (może to być coś, co można umieścić w wartości ST).
źródło
Napisałem wpis na blogu na temat modelowania IO jako formy asymetrycznej coroutine komunikującej się z systemem wykonawczym dla twojego języka. (Jest to wprawdzie trzecia część serii)
http://comonad.com/reader/2011/free-monads-for-less-3/
Ten post wyjaśnia, dlaczego trudno jest rozumieć semantykę „przemijania świata”.
źródło
Zobacz: Walka z niezręczną drużyną .
Głównym powodem jest to, że modele stanów RealWorld monady IO nie działają dobrze z współbieżnością. SPJ w tym czytelnym klasycznym faworyzuje semantykę operacyjną, aby ją zrozumieć.
źródło
Główna skarga na modele stanów RealWorld polega na tym, że, jak mówi TacTics, przekazywanie świata niekoniecznie działa z współbieżnością. Ale Wouter Swierstra i Thorsten Altenkirch pokazali, jak rozumować współbieżność jako efekt „przemijania świata”, z ustaloną, ale arbitralną sekwencją przeplatających się wątków w swoim artykule „Beauty in the Beast: A Functional Sematics for the Awkward Squad”: http : //www.staff.science.uu.nl/~swier004/Publications/BeautyInTheBeast.pdf
Odpowiadający temu kod znajduje się w Hackage jako IOSpec: http://hackage.haskell.org/package/IOSpec
Myślę, że teza Woutera jest bardziej szczegółowa: http://www.staff.science.uu.nl/~swier004/Publications/Thesis.pdf
źródło