サーバント サーバー ハンドラは、のnewtype ラッパーであり、、、 などExceptT
のインスタンスを持ちます。MonadThrow
MonadCatch
MonadError
これはやや不自然な例かもしれませんが、私がよく直面する問題を示しています。
ハンドラーで、 を返す 3 つの関数を呼び出してからEither String Int
、 type の計算を実行し、前Int -> Int -> Int -> IO (Either SomeError Text)
の 3 つInt
の s を取得します。
エラーができるだけ早く返されるようにするには、このコードをどのように構成すればよいですか?
Either
のインスタンスを使用して、最初の 3 つの計算を egMonad
に「折りたたむ」ことができます。次に、計算を何らかの結果値にバインドし、を使用して、成功した結果を返すか、型をスローするかを決定します(変換後)。 ?)、しかし、私は次のようなことができることを望んでいました:Either String Int
Either String (Int,Int,Int)
IO
case
throwError
SomeError
f, g, h :: Either String Int
a :: Int -> Int -> Int -> IO (Either SomeError Text)
myHandler :: Handler Text
myHandler = do
x1 <- f
x2 <- g
x3 <- h
liftIO $ convertError $ (a x1 x2 x3)
上のコードのように書けるでしょうか?