Вывод - это эффективное вычисление. Таким образом, имеет смысл инкапсулировать его в монаду. Но вход - это контекстно-зависимое вычисление. Таким образом, было бы более целесообразно инкапсулировать его в comonad.
Однако в Haskell ввод и вывод инкапсулированы в монаду IO
. Зачем?