Haskell 从快照访问MongoDB
我正在尝试使用splice中的mongodb haskell驱动程序(snap>0.5的snap驱动程序似乎已损坏)访问mongo 到目前为止,这是我所能做到的:Haskell 从快照访问MongoDB,haskell,mongodb,haskell-snap-framework,Haskell,Mongodb,Haskell Snap Framework,我正在尝试使用splice中的mongodb haskell驱动程序(snap>0.5的snap驱动程序似乎已损坏)访问mongo 到目前为止,这是我所能做到的: testSplice :: Splice AppHandler testSplice = do record <- liftIO $ do pipe <- runIOE $ connect (host "127.0.0.1") results <- access pipe master "db"
testSplice :: Splice AppHandler
testSplice = do
record <- liftIO $ do
pipe <- runIOE $ connect (host "127.0.0.1")
results <- access pipe master "db" (find $ select [] "coll")
close pipe
rest result
return $ [TextNode $ T.pack $ show $ records]
很抱歉,我发布了一个“给我发送代码plz”的问题,但我不知所措:我哪里出了问题,我该怎么做?我不是MongoDB专家,所以我不是100%确定(我也无法测试),但我怀疑你的
liftIO
放错地方了。我们有liftIO::MonadIO m=>IO a->ma
,因此我们应该将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]
(最后一个是OK,因为
return=liftIO.return
对于liftIO
的任何正常实现都是正确的)这里是用类型签名注释的函数。我想这就够了
很清楚问题出在哪里
testSplice :: Splice AppHandler
testSplice = do
record <- liftIO $ do
pipe <- runIOE $ connect (host "127.0.0.1") -- :: IO Pipe
results <- access pipe master "db" (find $ select [] "coll")
-- ^ :: IO (Either Failure Cursor)
close pipe -- :: IO ()
rest result -- :: Action m [Document]
return $ [TextNode $ T.pack $ show $ records]
testSplice::Splice AppHandler
testSplice=do
谢谢你的回答,丹尼尔:)。我明白你在说什么,但是find
的结果在IO中,所以我认为这不是问题所在。我的头撞到的是rest
的结果,这是Action m[Document]
。我只需要[Document]
部分,我不知道该如何将它绑定到另一个monad中?谢谢,@mightybyte。我想我只是忘了在rest result
之后添加return
(在那种状态下它不会进行打字检查!)。在find
(Action m Cursor
)的结果与rest
(Cursor->Action m[Document]
)之间的bind
起到了作用。我所做的错误是试图通过对access的值运行将rest
绑定到或失败游标
。再次感谢!
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]
testSplice :: Splice AppHandler
testSplice = do
record <- liftIO $ do
pipe <- runIOE $ connect (host "127.0.0.1") -- :: IO Pipe
results <- access pipe master "db" (find $ select [] "coll")
-- ^ :: IO (Either Failure Cursor)
close pipe -- :: IO ()
rest result -- :: Action m [Document]
return $ [TextNode $ T.pack $ show $ records]
result <- access pipe master "db" (find (select [] "coll") >>= rest)