次のコードを書いていることに気付いたので、モナド変換子の基本的な理解が欠けていると思います。
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
連携する最も簡単な方法は何ですか?