2

私はHaskellの初心者で、やって学ぶ傾向があります。

nextBatchまたはnextNでカーソルを使用する方法の例を誰かに教えてもらえますか? http://hackage.haskell.org/packages/archive/mongoDB/1.3.1/doc/html/Database-MongoDB-Query.html#g:12

このようなことを試みました(カスタム反復関数を作成しようとしました。ここで、fはすべてのドキュメントにマップする関数です)

let cursor = Mdb.find (Mdb.select selector collection)
       -- consume :: IO ()
       consume = do
                r <- runAction db $ Mdb.nextBatch =<< cursor
                if length (fromRight r) == 0
                    then return ()
                    else do
                        mapM_ f (fromRight r)
                        consume
   consume

これで、これは無限ループで実行され、常に同じドキュメントのセットが返されます。カーソルが変更されることはないと思いますか?カーソルタイプ自体は、その要素の1つとしてMVarを持っています。最初は、nextBatchを実行すると更新されると思いましたが、それは決して起こりません。

たぶん、IOではなくアクションモナド(mongoドライバーを参照)にとどまるように再帰を書き直す必要がありますか?ハマった。

4

1 に答える 1

2

あなたが書くとき、それは文脈の中でのみ実行されるlet cursor = Mdb.find (Mdb.select selector collection)ことを作成するので、実際には毎回新しいカーソルを作成しました。Action m CursorAction m=<< cursor

はい、ほとんどの場合、関数を書き直す必要があると思いAction mます。例えば:

consume :: IO ()
consume = void $ runAction db $ do
    cursor <- Mdb.find $ Mdb.select selector collection
    go cursor
  where
    go cursor = Mdb.nextBatch cursor >>= \result -> case result of
        [] -> return ()
        xs -> mapM_ f xs >> go cursor
于 2013-01-21T17:18:52.150 に答える