История изменений
Исправление monk, (текущая версия) :
Чего-то сомнительно, что вообще можно работу с захватом и отпуском мьютексов свести к проверке контракта вызова на этапе компиляции.
Почему?
Если вводим тип «захваченный мьютекс» и функцию, которая его захватывает и возвращает, то в других функциях можем требовать аргумент с типом «захваченный мьютекс». Чтобы потом он был гарантированно отпущен, можно сделать функцию которая выполнит защищённое мьютексом и отпустит его:
withMutex :: LockedMutex -> (LockedMutex -> IO a) -> IO a
withMutex m f = do
r <- f m
unlock m
return r
Исходная версия monk, :
Чего-то сомнительно, что вообще можно работу с захватом и отпуском мьютексов свести к проверке контракта вызова на этапе компиляции.
Почему?
Если вводим тип «захваченный мьютекс» и функцию, которая его захватывает и возвращает, то в других функциях можем требовать аргумент с типом «захваченный мьютекс». Чтобы потом он был гарантированно отпущен, можно сделать функцию которая выполнит защищённое мьютексом и отпустит его:
withMutex :: LockedMutex -> (LockedMutex -> IO a) -> IO a
withMutex m f = do
r <- f m
unlock m
r