3
{-# LANGUAGE DeriveDataTypeable, OverloadedStrings, ScopedTypeVariables #-}
module Db (
    couchTest
) where

import Control.Monad.IO.Class (liftIO)
import Data.ByteString (ByteString)
import Data.Generics (Data, Typeable)
import Database.CouchDB.Conduit
import Database.CouchDB.Conduit.Generic

conn :: CouchConnection
conn = def {couchLogin = "admin", couchPass = "admin"}

data D = D { f1 :: Int, f2 :: String } deriving (Show, Data, Typeable)

couchTest = runCouch conn $ do
    rev1 <- couchPut "mydb" "my-doc1" "" [] $ D 123 "str"
    rev2 <- couchPut "mydb" "my-doc1" rev1 [] $ D 1234 "another"
    (rev3, d1 :: D) <- couchGet "mydb" "my-doc1" []
    liftIO $ print d1
    couchPut' "mydb" "my-doc1" [] $ D 12345 "third"    -- notice - no rev
    rev3 <- couchRev "mydb" "my-doc1"
    couchDelete "mydb" "my-doc1" rev3

エラー

No instance for (monad-control-0.3.1.3:Control.Monad.Trans.Control.MonadBaseControl
                   IO m0)
  arising from a use of `couchPut'
Possible fix:
  add an instance declaration for
  (monad-control-0.3.1.3:Control.Monad.Trans.Control.MonadBaseControl
     IO m0)
In the expression: couchPut "mydb" "my-doc1" "" []
In a stmt of a 'do' block:
  rev1 <- couchPut "mydb" "my-doc1" "" [] $ D 123 "str"
In the second argument of `($)', namely
  `do { rev1 <- couchPut "mydb" "my-doc1" "" [] $ D 123 "str";
        rev2 <- couchPut "mydb" "my-doc1" rev1 [] $ D 1234 "another";
        (rev3, d1 :: D) <- couchGet "mydb" "my-doc1" [];
        liftIO $ print d1;
        .... }'

1)のインスタンス宣言をどのように追加しますmonad-control-0.3.1.3:Control.Monad.Trans.Control.MonadBaseControl IO m0か?

2)couchdb-conduitを使用してアタッチメントを作成することは可能ですか?

3)基本的にどのくらいのコードが必要かを確認するためにhttpパッケージでcouchdbを直接使用する例はありますか?

4

1 に答える 1

3

あなたは3つの異なることを尋ねているので、質問を分割する方が良いかもしれません. #1 に関する限り、MonadBaseControl に新しいインスタンスは必要ありません。あいまいさを取り除くために型シグネチャを追加すると、すぐにコンパイルされます。

{-# LANGUAGE DeriveDataTypeable, FlexibleContexts,
             OverloadedStrings, ScopedTypeVariables #-}
module Db (
    couchTest
) where

import Control.Monad.IO.Class (MonadIO, liftIO)
import Control.Monad.Trans.Resource (MonadThrow, MonadUnsafeIO)
import Control.Monad.Trans.Control (MonadBaseControl)
import Data.ByteString (ByteString)
import Data.Generics (Data, Typeable)
import Database.CouchDB.Conduit
import Database.CouchDB.Conduit.Generic

conn :: CouchConnection
conn = def {couchLogin = "admin", couchPass = "admin"}

data D = D { f1 :: Int, f2 :: String } deriving (Show, Data, Typeable)

couchTest
  :: (MonadIO m, MonadUnsafeIO m, MonadThrow m, MonadBaseControl IO m)
  => m ()
-- couchTest :: IO () -- restricting it to IO is also an option
couchTest = runCouch conn $ do
    rev1 <- couchPut "mydb" "my-doc1" "" [] $ D 123 "str"
    rev2 <- couchPut "mydb" "my-doc1" rev1 [] $ D 1234 "another"
    (rev3, d1 :: D) <- couchGet "mydb" "my-doc1" []
    liftIO $ print d1
    couchPut' "mydb" "my-doc1" [] $ D 12345 "third"    -- notice - no rev
    rev3 <- couchRev "mydb" "my-doc1"
    couchDelete "mydb" "my-doc1" rev3

NoMonomorphismRestriction言語プラグマを有効にして GHCi で以下を実行することで、GHC に制約リストを作成してもらいました。多くの場合、明示的な署名を追加する代わりに NMR フラグを設定したままにすることもできますが、私は明示的な署名を好みます。

*Db> :情報カウチテスト
カウチテスト ::
  (MonadIO m, Control.Monad.Trans.Resource.MonadUnsafeIO m,
   Control.Monad.Trans.Resource.MonadThrow m,
   MonadBaseControl IO m) =>
  メートル ()
    -- /tmp/cdb.hs:21:5 で定義
于 2012-08-03T16:44:24.303 に答える