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