Haskell postgresql simple查询字符串的类型错误

Haskell postgresql simple查询字符串的类型错误,haskell,overloaded-strings,Haskell,Overloaded Strings,与之相关的是,我有一个使用包构建的查询模板,然后我尝试将该模板传递给来自的query\u/execute\u函数。但编译器拒绝了,并且出现了错误 • Couldn't match type ‘[Char]’ with ‘Query’ Expected type: Query Actual type: String postgresql simple文档页面中值得注意的一段是,“要最容易地构造查询,请启用GHC的重载字符串语言扩展,并将您的查询编写为普通文本字符串

与之相关的是,我有一个使用包构建的查询模板,然后我尝试将该模板传递给来自的
query\u
/
execute\u
函数。但编译器拒绝了,并且出现了错误

    • Couldn't match type ‘[Char]’ with ‘Query’
      Expected type: Query
      Actual type: String

postgresql simple文档页面中值得注意的一段是,“要最容易地构造查询,请启用GHC的
重载字符串
语言扩展,并将您的查询编写为普通文本字符串。”因此,以下内容似乎可以工作:

{-# LANGUAGE QuasiQuotes       #-}
{-# LANGUAGE OverloadedStrings #-}

import Control.Monad (void)
import Database.PostgreSQL.Simple
import Data.String.Interpolate (i)

-- schema_name.table_name
type Table = String

dropTableIfExistsQuery :: Table -> String
dropTableIfExistsQuery tbl = [i| DROP TABLE IF EXISTS #{tbl} |]

dropTableIfExists :: Connection -> Table -> IO ()
dropTableIfExists conn tbl = void $ execute_ conn $ dropTableIfExistsQuery tbl
但这不会编译,如上所述:

    • Couldn't match type ‘[Char]’ with ‘Query’
  Expected type: Query
    Actual type: String
• In the second argument of ‘($)’, namely
    ‘dropTableIfExistsQuery tbl’
  In the second argument of ‘($)’, namely
    ‘execute_ conn $ dropTableIfExistsQuery tbl’
  In the expression:
    void $ execute_ conn $ dropTableIfExistsQuery tbl

有什么好处?为什么
OverloadedStrings
不在这里工作?

OverloadedStrings
只影响字符串文字,而不是所有类型的
string
术语。如果您有一个非文字的
字符串
,您可以使用以下方法将其显式转换为
IsString
(例如
Query
)的任何实例:


注意:我对
Query
和您正在使用的其他库了解不够,无法说明
fromString
是否具有您需要的行为;我只声明它具有您需要的类型。

您的代码特别说明了
droptableiExistery::…->字符串
,因此它返回一个字符串。不涉及重载。@melpomene函数族的
execute
/
query
有一个签名,如
Connection->query->IO Int64
,其中
query
是一个具有
IsString
实例的类型。我的理解是,我可以将
字符串
作为
查询
传递,而
重载字符串
扩展将负责强制。但不管文件怎么说,情况似乎并非如此。我的问题是,为什么?
OverloadedStrings
会将字符串文本的类型(即
“类似这样的双引号内容”
)从
string
更改为
IsString a=>a
。仅此而已。如果无法控制
tbl
的值,您也会受到SQL注入攻击。
fromString :: IsString a => String -> a