Монады не для этого, а для установления последовательности вычислений
Монады в целом присваивают семантику прикладным языкам, здесь даже не в последовательности дело, это простейший случай.
Tardis monad, наверно, можно привести как пример.
Сейчас, насколько я понимаю, ИО моделируется именно как State RealWorld# a. А семантика, вместе с неблокирующим ио, потоками, и прочими чудесами, скрыта в рантайме.
Зачем Input объединен с Output? Типа, раз мы State можем представить как композицию Reader.Writer, какая причина не дает сделать так же с ИО?