与this question相关的是,我使用interpolate包构建了一个查询模板,然后尝试从postgresql-simple传递给query_/execute_函数。但是编译器拒绝了,因为错误。
• Couldn't match type ‘[Char]’ with ‘Query’
Expected type: Query
Actual type: Stringpostgresql文档页面中值得注意的一段是:“为了最容易地构造查询,启用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不在这里工作?
发布于 2018-06-27 17:07:39
OverloadedStrings只影响字符串文本,而不是String类型的所有术语。如果您有一个非文字的String,则可以使用以下方法显式地将其转换为IsString的任何实例(例如Query):
fromString :: IsString a => String -> a注:我对Query和其他库还不太了解,无法说明fromString是否有您需要的行为;我只声称它有您需要的类型。
https://stackoverflow.com/questions/51067056
复制相似问题