关于this question,我有一个使用interpolate
包构建的查询模板,然后我试图将其传递给query_
/ {{1} } postgresql-simple
中的功能。但是编译器拒绝,并显示错误
execute_
文档页面上有关postgresql-simple的值得注意的一段话是:“为了最轻松地构建查询,请启用GHC的 • Couldn't match type ‘[Char]’ with ‘Query’
Expected type: Query
Actual type: String
语言扩展,并将查询写为普通的文字字符串。”因此,似乎应该可以进行以下操作:
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
为什么不在这里工作?
答案 0 :(得分:1)
OverloadedStrings
仅影响字符串文字,而不影响类型String
的所有术语。如果您有一个String
而不是文字,则可以使用以下方法将其显式转换为IsString
的任何实例(例如Query
):
fromString :: IsString a => String -> a
我对Query
以及您用来说fromString
是否具有所需行为的其他库知之甚少;我只声称它具有您需要的类型。