LINUX.ORG.RU

История изменений

Исправление hateyoufeel, (текущая версия) :

error превращается в исключение, если в IO.

Нет, не превращается. Error можно перехватить, но так делать не надо за очень редким исключением. В Haskell слегка бардак с термином «исключение» и под ним часто понимаются совершенно разные вещи. Если вкратце, error вызовет у тебя асинхронное исключение, как и, например, деление на 0 или завершение треда извне. Исключения типа IOException – синхронные, и обрабатываются иначе.

Но функция error совершенно не обязана вызывать асинхронное исключение в принципе, это особенность реализации. Вот такая реализация тоже будет валидной, и твой код должен это учитывать.

Prelude> let error :: String -> a; error s = error s
Prelude> :t error
error :: String -> a

Список событий вполне работает и с потоками и с синхронизацией.

Я не понимаю, как в твоём представлении это работает. Как именно ты spawn реализуешь и какой тип будет иметь эта функция?

Исходная версия hateyoufeel, :

error превращается в исключение, если в IO.

Нет, не превращается. Error можно перехватить, но там делать не надо за очень редким исключением. В Haskell слегка бардак с термином «исключение» и под ним часто понимаются совершенно разные вещи. Если вкратце, error вызовет у тебя асинхронное исключение, как и, например, деление на 0 или завершение треда извне. Исключения типа IOException – синхронные, и обрабатываются иначе.

Но функция error совершенно не обязана вызывать асинхронное исключение в принципе, это особенность реализации. Вот такая реализация тоже будет валидной, и твой код должен это учитывать.

Prelude> let error :: String -> a; error s = error s
Prelude> :t error
error :: String -> a

Список событий вполне работает и с потоками и с синхронизацией.

Я не понимаю, как в твоём представлении это работает. Как именно ты spawn реализуешь и какой тип будет иметь эта функция?