Есть у меня устройство, которое может находится в одном из нескольких конечных состояний. Для разных состояний устройства есть разные способы отправить его в другое состояние. В принципе можно описать все эти способы функциями над монадой State, а сами состояния изображать конструкторами алгебраического типа. Но тогда в рантайме придётся перепроверять а в правильном ли мы состоянии для вызова этой функции. Кроме того из самой функции будет не очевидно когда её можно вызывать. Можно закодировать состояния разными типами, а машину состояний суммой этих типов, а способы кодировать специальной монадой параметризованной типом состояния в котором можно её использовать. Но тогда нужен типобезопасный case, который позволяет при удачном сопоставление выполнять вычисления только внутри нужной монады. Кроме того типов станет ещё больше. Я недавно столкнулся с тем, что у меня есть типы параметризованные восьмью переменными и нужно ещё!