Sql 如何限制函数调用方在Haskell中传递连接字符串?

Sql 如何限制函数调用方在Haskell中传递连接字符串?,sql,haskell,Sql,Haskell,我正在查看一个叫做Bryan O'Sullivan的haskell mysql客户端库。库不允许用户使用连接字符串作为查询 以下工作很好: myQuery :: Query myQuery = "SELECT id, name FROM users LIMIT 1" 但是,这一点失败了: myQuery :: Query myQuery = "SELECT id, name FROM users LIMIT 1" ++ "" 这是我在运行以下示例时遇到的错误: do rows <-

我正在查看一个叫做Bryan O'Sullivan的haskell mysql客户端库。库不允许用户使用连接字符串作为查询

以下工作很好:

myQuery :: Query
myQuery = "SELECT id, name FROM users LIMIT 1"
但是,这一点失败了:

myQuery :: Query
myQuery = "SELECT id, name FROM users LIMIT 1" ++ ""
这是我在运行以下示例时遇到的错误:

do
  rows <- (query_ connection myQuery) :: IO [( Int , String)]
...


• Couldn't match expected type ‘Query’ with actual type ‘[Char]’
• In the expression: "SELECT id, name FROM users LIMIT 1" ++ ""
  In an equation for ‘myQuery’:
      myQuery = "SELECT id, name FROM users LIMIT 1" ++ ""
我的问题是,是什么使这种限制成为可能

我可以从中看出这是有意的,但我无法理解其背后的基本概念。是因为查询类型不是字符串所在的typeclass的实例吗?此外,即使我连接字符串,类型检查器是否应该推断结果字符串可以用作查询


提前感谢。

实际上,它确实允许连接字符串作为查询。您只需要使用对查询进行操作的连接运算符:

myQuery :: Query
myQuery = "SELECT id, name FROM users LIMIT 1" <> ""
实际上是foo=fromString foo的缩写。因此,想象一下在没有扩展的情况下工作,您可以看到这两者之间的区别:

foo1 = fromString "bar" ++ fromString "baz"
foo2 = fromString ("bar" ++ "baz")

前者对应于你写的东西;后者与您的意思相对应。

实际上,它允许连接字符串作为查询。您只需要使用对查询进行操作的连接运算符:

myQuery :: Query
myQuery = "SELECT id, name FROM users LIMIT 1" <> ""
实际上是foo=fromString foo的缩写。因此,想象一下在没有扩展的情况下工作,您可以看到这两者之间的区别:

foo1 = fromString "bar" ++ fromString "baz"
foo2 = fromString ("bar" ++ "baz")

前者对应于你写的东西;后者符合您的意思。

注意:未测试。我只是参考了文档,我没有安装软件包并检查它是否有效。在看到您的回复后,我意识到我可以使用mappend,因为源代码也显示了这一点。如果导入Data.Monoid,也可以使用运算符。此外,您关于重载字符串的评论是正确的。我应该在问题中澄清这一点,但你的回答解释了我想知道的。非常感谢@mandark Yes、mappend和是同义词,只要输入正确。注意:未测试。我只是参考了文档,我没有安装软件包并检查它是否有效。在看到您的回复后,我意识到我可以使用mappend,因为源代码也显示了这一点。如果导入Data.Monoid,也可以使用运算符。此外,您关于重载字符串的评论是正确的。我应该在问题中澄清这一点,但你的回答解释了我想知道的。非常感谢@mandark Yes、mappend和是同义词,只要输入正确。