MongoDB插入错误

时间:2013-03-08 03:58:01

标签: mongodb haskell insert

我在看起来像基本插件时遇到错误。相关代码是

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,除非我遗漏了某些内容,否则应该有效。

任何提示?

2 个答案:

答案 0 :(得分:2)

仔细看看你提到的两个链接。 Haskell MongoDB绑定提供了两个看起来非常相似的运算符:

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

第二种形式过载,使用起来更灵活。 Val类中包含String的任何内容都可以作为第二个参数传递。因此,您可能希望:=更改newRecord=:的出现次数(相应地调整类型签名)。那么你的例子就可以了。

答案 1 :(得分:1)

newRecord期望fnamelname具有Value类型。您传递了两个重载的String,但GHC无法找到IsString Value的实例,以将那些重载的String转换为Value

我看到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]