servant-server Handler是一个新类型的包装器,具有, ,等ExceptT
的实例。MonadThrow
MonadCatch
MonadError
这可能是一个有点做作的例子,但它显示了我经常面临的一个问题:
在处理程序中,我想调用三个返回的函数Either String Int
,然后执行 type 的计算,从之前Int -> Int -> Int -> IO (Either SomeError Text)
获取三个Int
s。
我应该如何构建此代码以确保尽早返回错误?
我看到我可以使用Either
'Monad
实例将前三个Either String Int
计算“折叠”到 egEither 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)
是否可以编写类似于上面的代码?