与这个问题相关,我有一个使用interpolate
包构建的查询模板,然后我试图将其传递给query_
/execute_
函数postgresql-simple
。但编译器拒绝,并出现错误
• Couldn't match type ‘[Char]’ with ‘Query’
Expected type: Query
Actual type: String
postgresql-simple 的文档页面中值得注意的一段话是,“要最轻松地构建查询,请启用 GHC 的OverloadedStrings
语言扩展并将您的查询编写为普通的文字字符串。” 因此,看起来以下应该有效:
{-# 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
这里工作?