IO
Монады в Haskell часто объясняется как государственной монады , где государство является мир. Таким образом, значение типа IO a
monad рассматривается как нечто подобное worldState -> (a, worldState)
.
Некоторое время назад я прочитал статью (или сообщение в блоге / списке рассылки), в которой критиковал это мнение и приводил несколько причин, по которым он неверен. Но я не могу вспомнить ни статью, ни причины. Кто-нибудь знает?
Изменить: статья кажется потерянной, поэтому давайте начнем собирать различные аргументы здесь. Я начинаю вознаграждение, чтобы сделать вещи более интересными.
Редактировать: статья, которую я искал, - « Борьба с неловким составом: монадический ввод / вывод, параллелизм, исключения и вызовы на иностранном языке в Haskell » Саймона Пейтона Джонса. (Благодаря ответу TacTics.)
источник
Ответы:
Проблема в
IO a = worldState -> (a, worldState)
том, что если бы это было правдой, то мы могли бы доказать этоforever (putStrLn "Hello") :: IO a
иundefined :: IO a
быть равными. Вот доказательство любезности dolio (2010, irc):Лемма:
(\r w -> r (snd $ m w)) ⊥ = ⊥
Следовательно
forever m = fix (\r -> \w -> r (snd $ m w)) = ⊥
В частности
forever (putStrLn "Hello") = ⊥
и, следовательно,forever (putStrLn "Hello")
иundefined
эквивалентные программы. Тем не менее, очевидно, что они не должны рассматриваться как эквивалентные программы, в теории или на практике.Обратите внимание, что эта модель неверна даже без вызова параллелизма.
источник
undefined
чистой семантике Haskell? Предполагается, что разные объекты неразличимы в чистой семантике Хаскелла! Но когда мы оперативно думаем о наших программах, мы хотим различать и разные виды, даже когда ониIO
не задействованы; Мне важно, выдает ли моя программа исключение или входит в бесконечный цикл, даже если вы можете доказать, что они равны, доказав, что они оба ⊥. На самом деле это не противоречие.forever (putStrLn "Hello")
не похоже[0,1..]
, конечно. Ваше доказательство не является особеннымworldState
, поэтому оно также относится к обычной государственной монаде. Такforever (someModificationWith "Hello")
что также денотально эквивалентно ⊥. Я совершенно не удивлен этим результатом; это не продуктивно в денотационной семантике, и то, что компьютер делает оперативно, пока мы ждем вечно, не имеет значения. То же самое дляforever (putStrLn "Hello")
; оно не создает и не должно создавать новое мировое состояние, которое мы можем лениво потреблять.Вот простой ответ: любое изменение состояния государственной монады происходит из-за любых действий, выполняемых в монаде. Если действительно объяснение «WorldState -> (a, WorldState)» требует того же свойства, а WorldState является чистым значением, которое изменяется только монадой ввода-вывода, это неправильно. Время изменяется, содержимое файлов, состояние дескрипторов и т. Д. Могут меняться независимо от того, что происходит в монаде ввода-вывода. В этом смысл монады IO. Тот факт, что GHC передает значение RealWorld (или то, что было), является гарантией того, что все работает по порядку, насколько я знаю, если это (возможно, это просто что-то, что можно ввести в значение ST).
источник
Я написал сообщение в блоге на тему, как смоделировать IO как форму асимметричной сопрограммы, взаимодействующей с системой времени исполнения для вашего языка. (По общему признанию третья часть серии)
http://comonad.com/reader/2011/free-monads-for-less-3/
В этом посте рассказывается о том, почему неловко рассуждать о семантике «прохождения мира».
источник
См. Борьба с неуклюжим отрядом .
Основная причина в том, что модели состояний монады ввода-вывода RealWorld не работают с параллелизмом. SPJ в этой читаемой классике предпочитает использовать операционную семантику, чтобы понять это.
источник
Основная претензия к моделям состояния RealWorld заключается в том, что, как говорит TacTics, передача мира не обязательно работает с параллелизмом. Но Вутер Свирстра и Торстен Альтенкирх показали, как рассуждать о параллелизме как о «проходящем мире» эффекте, с фиксированной, но произвольной последовательностью чередующихся потоков в своей статье «Красота в чудовище: функциональная сематика для неуклюжего отряда»: http : //www.staff.science.uu.nl/~swier004/Publications/BeautyInTheBeast.pdf
Код, соответствующий этому, находится на Hackage как IOSpec: http://hackage.haskell.org/package/IOSpec
Я думаю, что тезис Ваутера становится более подробным: http://www.staff.science.uu.nl/~swier004/Publications/Thesis.pdf
источник