【发布时间】:2015-06-29 19:45:26
【问题描述】:
我将 EitherT 与 IO 结合使用来进行错误处理。我在 IO monad 中有一个从数据库获取数据的函数,因此它具有 IO [Value] 类型。我使用 liftIO 将这个函数提升到我的 EitherT IO monad 中,并将这个函数的结果绑定到一个变量。问题是 GHC 告诉我变量的类型为 IO [Value] 而不仅仅是 [Value]。我的代码是这样的
getItem :: (IConnection a) => a -> ItemId -> EitherT String IO Item
getItem conn id = do
result <- liftIO $ do
... database stuf
似乎我误解了 liftIO 和绑定变量的工作原理。我认为 liftIO 会接受 IO [Value] 并返回 EitherT String IO [Value],当绑定到一个变量时,它的类型是 [Value]。不过好像我错了。
【问题讨论】:
-
好像在某个地方
Maybe挡道了。您能否检查(例如在 ghci 中)liftIO中包含的表达式的类型是什么?也许发布整个函数,看看我们从哪里得到Just? -
除此之外,您可能对Ganeti 项目(我所属的项目)使用的概念感兴趣:一个名为
ResultT的自定义monad 转换器,与EitherT同构,但其liftIOimplementation 捕获IO错误并将它们转换为ResultTmonad 的错误部分。这非常方便,因为失败的包装原语IO操作由 monad 很好地处理。 -
GHC 给您的确切错误是什么?请发布足够多的代码(可能是用
undefined删除的无关内容的实现),以便我们重现您的错误。
标签: haskell monads monad-transformers