История изменений
Исправление
dave,
(текущая версия)
:
Со стороны выглядит все очень просто. Монадический тип Cont со своими аналогами throw, catch и finally, плюс liftIO, где собственно ошибка IOException и перехватывается.
Идея та же самая, что в F# async workflow, только у Дона Сайма ошибка перехватывается внутри самого комбинатора >>=, который там зовется Bind, ибо язык F# - энергичный. В хаскеле большого смысла перехватывать IOException в >>= нет, да и по хорошему не получится из-за ленивости (и чистоты), а вот в liftIO - вполне легко.
Исходная версия
dave,
:
Со стороны выглядит все очень просто. Монадический тип Cont со своими аналогами throw, catch и finally, плюс liftIO, где собственно ошибка IOException и перехватывается.
Идея та же самая, что в F# async workflow, только у Дона Сайма ошибка перехватывается внутри самого комбинатора >>=, который там зовется Bind, ибо язык F# - энергичный. В хаскеле большого смысла перехватывать IOException в >>= нет, да и по хорошему не получится из-за ленивости, а вот в liftIO - вполне легко.