使用liftIO和monad变换器,为什么绑定变量IO List的类型而不是List?

时间:2015-06-29 19:45:27

标签: haskell monads monad-transformers

我正在将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]类型。但似乎我错了。

1 个答案:

答案 0 :(得分:3)

我想出了我的问题。我在一个已经是IO值的值上调用return,导致IO(IO [Value])。