Я не эксперт MongoDB, поэтому я не уверен на 100% (и я не могу это проверить), но подозреваю, что вы получили liftIO
не в том месте.У нас есть liftIO :: MonadIO m => IO a -> m a
, поэтому мы должны применить liftIO
к действиям, которые на самом деле IO
, но которые мы хотим быть чем-то большим, чем IO
.Я подозреваю, что access
- это функция с типом возврата больше чем IO
.Предполагая, что runIOE
, close
и rest
все на самом деле имеют IO
возвращаемые типы, мы бы тогда сделали что-то вроде этого:
testSplice = do
pipe <- liftIO . runIOE $ connect (host "127.0.0.1")
results <- access pipe master "db" (find $ select [] "coll") -- note: no liftIO on this one because it's presumably already lifted
liftIO $ close pipe
record <- liftIO $ rest result
return [TextNode . T.pack . show $ records]
Если некоторые из этих действий на самом деле не IO
вещи, тогда вы можете отбросить liftIO
из этих.
Как вы заметили, это можно немного убрать: любые смежные строки, начинающиеся с liftIO
, могут быть объединены.Так что если вышеприведенное окажется правильным местом для liftIO
с, то его также можно записать в виде:
testSplice = do
pipe <- liftIO . runIOE $ connect (host "127.0.0.1")
results <- access pipe master "db" (find $ select [] "coll")
liftIO $ do
close pipe
record <- rest result
return [TextNode . T.pack . show $ records]
(Последнее там нормально, потому что return = liftIO . return
для любой вменяемой реализацииliftIO
.)