【发布时间】:2018-03-28 06:43:22
【问题描述】:
servant-server Handler 是 ExceptT 上的新类型包装器,具有 MonadThrow、MonadCatch、MonadError 等的实例。
这可能是一个有点做作的例子,但它显示了我经常遇到的一个问题:
在处理程序中,我想调用三个返回 Either String Int 的函数,然后执行 Int -> Int -> Int -> IO (Either SomeError Text) 类型的计算,从之前获取三个 Ints。
我应该如何构造这段代码以确保尽早返回错误?
我发现我可以使用Either 的Monad 实例将前三个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)
是否可以写成类似上面的代码?
【问题讨论】:
-
您可能会遇到
Handler是ExceptT ServantErr的问题,但您的错误是Strings。我们可以假设你有一个函数String -> ServantErr可以用来转换错误吗?
标签: haskell monad-transformers servant