1

这个问题相关,我有一个使用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这里工作?

4

1 回答 1

1

OverloadedStrings仅影响字符串文字,而不影响 type 的所有术语String。如果您有 a Stringwhich 不是文字,您可以使用以下命令将其显式转换为IsString(eg Query) 的任何实例:

fromString :: IsString a => String -> a

注意我不太了解Query您使用的其他库是否fromString有您需要的行为;我只声称它具有您需要的类型。

于 2018-06-27T17:07:39.700 回答