Оффтопик, но всё-таки хочется узнать в чём разница. MVar ведёт себя как semaphor(counter =1) и непонятно, зачем нужен semaphor(counter > 1) 🤔
ref всегда содержит значение,
а semaphore автоматически удаляет отменённые процессы
с MVar пока кто-то взял значение на обработку, вы не сможете прочитать его, и вам нужно очень аккуратно обработать брэкет на каждую функцию, чтобы в случае отмены/ошибки, она положила что-то обратно