Исключения это какая-то отдельная фича Хаскела или построена на функциях? Просто если я делаю System.IO.openFile, то мне возвращается IO Handle, но если файла нет, то выбрасывается исключение, которое надо ловить через try в Either. Если этого не делать, то прога валится и в stdout пишется сообщение. Исключение как-то хитро прячется в IO Handle? Ну, я понимаю про контекст, что в случае ошибки контекст будет вот такой, в случае нормы другой, но как main :: IO () выковыривает ошибку?