Я читаю главу об исключениях, поэтому я решил поэкспериментировать и сопоставить исключение с преобразователем монад ExceptT. Моя функция getInt может читать целое число из консоли и сообщать об исключениях в виде Left "что не так":
getInt :: ExceptT String IO Int
getInt = ExceptT $ do
Right . read <$> getLine
`catch` \(e :: ErrorCall) -> return . Left . show $ e
Я пробовал, к сожалению, исключение не было обнаружено, лень насмехается надо мной. Хорошо, позвольте мне сделать это строго с seq
.
getInt :: ExceptT String IO Int
getInt = ExceptT $ do
read <$> getLine >>= seq <*> return . Right
`catch` \(e :: ErrorCall) -> return . Left . show $ e
Результат: Слева "Prelude.read: no parse". Теперь это работает!
Мой вопрос здесь - это правильный путь, как сопоставить исключение с ExceptT?