Чтобы ограничить какие-то участки кода определённым набором легальных операций, кроме которых ничё нельзя вызвать, типа произвольного IO или смены стейта. Смысл такой же, как у геттеров и сеттеров вместо обычного присваивания, или как у абстрактных типов данных