История изменений
Исправление
dave,
(текущая версия)
:
И пример с liftIO выглядит как беспомощный workaround
Кстати, вот вспомнилось из моей же практики. LiftIO отлично подошел для обработки ошибок IOException в монаде, основанной на продолжениях (стандартный ContT этого не умеет - там банально не хватает еще одного дополнительного продолжения для перенаправления вычисления по другой ветке, где уже расставлены нужные обработчики). Если бы не было liftIO, то я даже не представляю, как можно было бы обработать IOException в ленивом языке. А сейчас все получилось у меня очень стройно и красиво. Ошибки IOException нужно перехватывать только внутри liftIO, потому что в чистом коде их возникнуть не должно в принципе (да, есть еще предательский throw, который это дело может обойти, но это уже будет логическая ошибка программиста-пользователя).
Исходная версия
dave,
:
И пример с liftIO выглядит как беспомощный workaround
Кстати, вот вспомнилось, из моей же практики. LiftIO отлично подошел для обработки ошибок IOException в монаде, основанной на продолжениях (стандартный ContT этого не умеет - там банально не хватает еще одного дополнительного продолжения для перенаправления вычисления по другой ветке, где уже расставлены нужные обработчики). Если бы не было liftIO, то я даже не представляю, как можно было бы обработать IOException в ленивом языке. А сейчас все получилось у меня очень стройно и красиво. Ошибки IOException нужно перехватывать только внутри liftIO, потому что в чистом коде их возникнуть не должно в принципе (да, есть еще предательский throw, который это дело может обойти, но это уже будет логическая ошибка программиста-пользователя).