Пытаясь понять, как программы GHC работают с сигналами и исключениями, я обнаружил интересную, но неокончательную дискуссию относительно «исправления» скобки .
Я изо всех сил пытаюсь понять, зачем понадобиться изменение, когда скобка уже маскирует асинхронные исключения .
Мне кажется, что либо прерывание (как в сигналах POSIX) не является асинхронным исключением, либо я упускаю некоторые детали в текущей давней реализации:
bracket before after thing =
mask $ \restore -> do
a <- before
r <- restore (thing a) `onException` after a
_ <- after a -- can be interrupted??
return r
В моем понимании, after a
должен быть оценен, чтобы обеспечить IO
действие, которое будет вызвано монадой IO
, которая находится в пределах mask
.
РЕДАКТИРОВАТЬ: В то время как на тему, почему after
не запускается дважды в случае исключения?