Haskell,MongoDB驱动程序,>>;=,及<<=

Haskell,MongoDB驱动程序,>>;=,及<<=,mongodb,haskell,operators,driver,monads,Mongodb,Haskell,Operators,Driver,Monads,编辑:想在论坛版主巨魔关闭这篇文章之前很快把这篇文章写进去(他们已经回顾了我几个月前的文章,对它们进行了投票,然后关闭它们)。问题要么是驱动程序,要么是文档,因为示例代码在我运行它时有相同的问题 我试图评估Haskell在MongoDB中的使用情况。我尝试编写自己的简单程序,使用此驱动程序页面上的示例对数据库执行简单操作。我可以打开一个连接,甚至插入数据库(我检查了数据库,所有东西都在里面)。我遇到的问题是,一旦我打开连接并执行某些操作,我就无法让Haskell程序“返回”到解释器、打印一些值或

编辑:想在论坛版主巨魔关闭这篇文章之前很快把这篇文章写进去(他们已经回顾了我几个月前的文章,对它们进行了投票,然后关闭它们)。问题要么是驱动程序,要么是文档,因为示例代码在我运行它时有相同的问题

我试图评估Haskell在MongoDB中的使用情况。我尝试编写自己的简单程序,使用此驱动程序页面上的示例对数据库执行简单操作。我可以打开一个连接,甚至插入数据库(我检查了数据库,所有东西都在里面)。我遇到的问题是,一旦我打开连接并执行某些操作,我就无法让Haskell程序“返回”到解释器、打印一些值或执行任何其他操作。这可能是个错误的词,但我认为程序本质上是“锁定的”


不确定,但我相信我没有在“do”符号中正确终止,因此我认为它只是坐在那里。在查看驱动程序页面上的示例时,我注意到它使用了诸如>>=和之类的运算符,因此,请求是在不进入monad的情况下解释Moand类的中心操作。为什么不呢,我喜欢挑战

>
开始,它在其他语言中的作用类似于分号。它允许您在一行中粘贴两个动作。这是谎言,但你不想面对真相。(真相包括理解行为和功能之间的区别。)

但是如果我们需要在下一个动作中使用一个动作的结果,会发生什么呢?
>=
运算符获取一个操作的结果,并将其作为参数提供给下一个(=>=printDocs“所有团队”与

do
   teams <- allTeams
   printDocs "All Teams" teams
从你的描述我们应该看到

Start --
before insert
^C -- we got stuck here
如果是这种情况,我需要查看
资料…

如果您进一步了解该程序(我的直觉告诉您将看到“插入后”而不是“关闭管道前”),那么我们需要讨论haskell是否正确地与Mongo进行通信。即使它正确地记录了插入,管道也可能“暂停”等待不来的同步事件


然后,我们可以相信这不是haskell的错误使用,而是MongoDB库的错误使用,并在考虑到这一点的情况下提出另一个SO问题。

仍然无法让它在(成功)之后“返回”做数据库的事情。还有其他建议吗?废话。我很早就被引导相信是我对monads和IO的理解造成了问题,因为文档中的例子是有效的,而我的例子本质上是一个精简版本。如果MondoDB有问题,那么,我不需要在这里提问来解决这个问题.真是浪费时间啊。@JohnFMiller,显然MongoDB库的使用并不是不正确的,除非文档中的示例也错误地使用了它。我刚刚发现它也有同样的问题-至少在我的设置上是这样。
allTeams = do
   cursor <- find (select [] "team") {sort = ["home.city" =: 1]}`
   rest cursor
main = do
    putStrLn "Start --"
    pipe <- runIOE $ connect (host "127.0.0.1")
    e <- access pipe master "test" run
    liftIO $ putStrLn "before close pipe"
    close pipe
    print e
    putStrLn "\n Finished"

run = do
    liftIO $ putStrLn "before insert"
    test_insert
    liftIO $ putStrLn "after insert"

test_insert = insertMany "blah" [ stuff... ]
Start --
before insert
^C -- we got stuck here