我正在将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]类型。但似乎我错了。
答案 0 :(得分:3)
我想出了我的问题。我在一个已经是IO值的值上调用return,导致IO(IO [Value])。