我在看起来像基本插件时遇到错误。相关代码是
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"
根据this和this,除非我遗漏了某些内容,否则应该有效。
任何提示?
答案 0 :(得分:2)
仔细看看你提到的两个链接。 Haskell MongoDB绑定提供了两个看起来非常相似的运算符:
(:=) :: Label -> Value -> Field
(=:) :: Val v => Label -> v -> Field
第二种形式过载,使用起来更灵活。 Val
类中包含String
的任何内容都可以作为第二个参数传递。因此,您可能希望:=
更改newRecord
中=:
的出现次数(和相应地调整类型签名)。那么你的例子就可以了。
答案 1 :(得分:1)
newRecord期望fname
和lname
具有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]