уточню, что решение с ExceptT выглядит примерно так: doit :: Int -> Int -> IO (Either String Int) doit a b = runExceptT do a' <- ExceptT $ foo a b' <- ExceptT $ bar b pure $ a' + b' то есть можно его использовать только в том месте, где нужно такое поведение (чтобы IO + Either вели себя как одна монада), совсем не обязательно все процедуры помечать ExceptT
а если тип функции абстригирован от IO , то как можно описать? doit :: Int -> Int -> m (Either String Int)
если Monad m =>, будет так же
Обсуждают сегодня