1

基本的な挿入のように見えるものでエラーが発生します。関連するコードは

newConn = runIOE $ connect $ host "127.0.0.1"
run pipe act = access pipe master "MyDB" act

newRecord :: Pipe -> Value -> Value -> IO (Either Failure Value)
newRecord pipe fname lname = run pipe $ insert "people" ["name" := fname, "lastName" := lname]

GHCi に飛び乗って実行すると

:set -XOverloadedStrings
pipe <- newConn
newRecord pipe "Inai" "mathi"

エラーが発生します

<interactive>:95:16:
    No instance for (Data.String.IsString Database.MongoDB.Value)
      arising from the literal `"Inai"'
    Possible fix:
      add an instance declaration for
      (Data.String.IsString Database.MongoDB.Value)
    In the second argument of `newRecord', namely `"Inai"'
    In the expression: newRecord pipe "Inai" "mathi"
    In an equation for `it': it = newRecord pipe "Inai" "mathi"

thisthisによると、何かが欠けていない限り、うまくいくはずです。

ヒントはありますか?

4

2 に答える 2

2

あなたが言及している2つのリンクを注意深く見てください。Haskell MongoDB バインディングは、非常によく似た 2 つの演算子を提供します。

(:=) :: Label -> Value -> Field
(=:) :: Val v => Label -> v -> Field

2 番目の形式はオーバーロードされており、より柔軟に使用できます。s を含む、Valクラス内にあるものStringはすべて、2 番目の引数として渡すことができます。:=したがって、おそらくin newRecordby =:(の発生を変更し、それに応じて型シグネチャ適応させたいと思うでしょう)。次に、あなたの例が機能します。

于 2013-03-08T08:42:36.073 に答える
1

newRecord は type を期待fnamelname、持つ必要がありValueます。2 つのオーバーロードされた s を渡していますStringが、GHC はこれらのオーバーロードされた s をsに変換するためのIsStringforのインスタンスを見つけることができません。ValueStringValue

ValueコンストラクターがあることがわかりましたString :: Text -> Value。これがコンパイルされるかどうかを確認します。

newRecord :: Pipe -> Text -> Text -> IO (Either Failure Value)
newRecord pipe fname lname = run pipe $ insert "people" ["name" := String fname, "lastName" := String lname]
于 2013-03-08T04:33:13.070 に答える