Я думаю, что мне не хватает базового понимания преобразователей монад, потому что я обнаружил, что пишу этот код:
import Control.Monad.Identity
import Control.Monad.Error
liftError :: Either String Int -> ErrorT String Identity Int
liftError x = do case x of
Right val -> return val
Left err -> throwError err
gateway :: Bool -> ErrorT String Identity Int
gateway = liftError . inner
inner :: Bool -> Either String Int
inner True = return 5
inner False = throwError "test"
Хотя это работает, я думаю, что это можно было бы сделать более элегантно. В частности, я ищу замену liftError
, которую, я думаю, мне не нужно определять для себя.
Какой самый простой способ заставить gateway
и inner
работать вместе без изменения их типа?