История изменений
Исправление monk, (текущая версия) :
Вот этим. throwIO гарантирует порядок операций, throw – нет.
С seq как раз и есть магия. Так как по определению seq вычисляет первый аргумент и возвращает второй, если первый не ошибка. То есть throwIO e не является ошибкой. А становится ею только когда её результат вычисляется внутри монады IO.
Ловли чем?
Я же написал псевдокод. Если первый элемент списка событий является событием от второго потока, его обрабатываем. Фактически, полный аналог receive/end из Эрланга.
Если ты хочешь как в Erlang, у тебя все функции должны возвращать IO, потому что чистых функций в Erlang нет. Как и статической типизации.
В моём варианте IO вообще нет и все функции чистые. Как и в раннем Хаскеле. Только ленивый список событий на входе и возврат другого ленивого списка событий на выходе.
Исходная версия monk, :
Вот этим. throwIO гарантирует порядок операций, throw – нет.
С seq как раз и есть магия. Так как по определению seq вычисляет первый аргумент и возвращает второй, если первый не ошибка. То есть throwIO e не является ошибкой. А становится ею только когда её результат вычисляется внутри монады IO.
Ловли чем?
Я же написал [url=https://www.linux.org.ru/forum/development/16883697?cid=16883893]псевдокод[/url]. Если первый элемент списка событий является событием от второго потока, его обрабатываем. Фактически, полный аналог receive/end из Эрланга.
Если ты хочешь как в Erlang, у тебя все функции должны возвращать IO, потому что чистых функций в Erlang нет. Как и статической типизации.
В моём варианте IO вообще нет и все функции чистые. Как и в раннем Хаскеле. Только ленивый список событий на входе и возврат другого ленивого списка событий на выходе.