Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 从快照访问MongoDB_Haskell_Mongodb_Haskell Snap Framework - Fatal编程技术网

Haskell 从快照访问MongoDB

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"

我正在尝试使用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" (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)