6

サーバント サーバー ハンドラは、のnewtype ラッパーであり、、、 などExceptTのインスタンスを持ちます。MonadThrowMonadCatchMonadError

これはやや不自然な例かもしれませんが、私がよく直面する問題を示しています。

ハンドラーで、 を返す 3 つの関数を呼び出してからEither String Int、 type の計算を実行し、前Int -> Int -> Int -> IO (Either SomeError Text)の 3 つIntの s を取得します。

エラーができるだけ早く返されるようにするには、このコードをどのように構成すればよいですか?

Eitherのインスタンスを使用して、最初の 3 つの計算を egMonadに「折りたたむ」ことができます。次に、計算を何らかの結果値にバインドし、を使用して、成功した結果を返すか、型をスローするかを決定します(変換後)。 ?)、しかし、私は次のようなことができることを望んでいました:Either String IntEither String (Int,Int,Int)IOcasethrowErrorSomeError

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)

上のコードのように書けるでしょうか?

4

2 に答える 2

2

hnefatlの回答にはHandlerの構築が欠けていると思います(質問がServant 0.15前後について行われたと仮定して)。知らせ

newtype Handler a = Handler { runHandler' :: ExceptT ServantErr IO a }

これは私がしなければならなかったことです

eitherToHandler :: (e -> ServantErr) -> Either e a -> Handler a
eitherToHandler f = Handler . withExceptT f . liftEither
于 2022-01-19T18:56:18.860 に答える