Поднимите значение ошибки в монадный преобразователь ErrorT

Я думаю, что мне не хватает базового понимания преобразователей монад, потому что я обнаружил, что пишу этот код:

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работать вместе без изменения их типа?

5
задан Niklas B. 4 April 2012 в 17:58
поделиться