首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用postgresql-simple查询字符串的类型错误

使用postgresql-simple查询字符串的类型错误
EN

Stack Overflow用户
提问于 2018-06-27 15:58:53
回答 1查看 216关注 0票数 1

this question相关的是,我使用interpolate包构建了一个查询模板,然后尝试从postgresql-simple传递给query_/execute_函数。但是编译器拒绝了,因为错误。

代码语言:javascript
复制
    • Couldn't match type ‘[Char]’ with ‘Query’
      Expected type: Query
      Actual type: String

postgresql文档页面中值得注意的一段是:“为了最容易地构造查询,启用GHC的OverloadedStrings语言扩展,并将查询写成一个普通的文字字符串。”因此,以下几点似乎应该有效:

代码语言:javascript
复制
{-# 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

但是,这不会编译,如上面所示:

代码语言:javascript
复制
    • 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不在这里工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-27 17:07:39

OverloadedStrings只影响字符串文本,而不是String类型的所有术语。如果您有一个非文字的String,则可以使用以下方法显式地将其转换为IsString的任何实例(例如Query):

代码语言:javascript
复制
fromString :: IsString a => String -> a

注:我对Query和其他库还不太了解,无法说明fromString是否有您需要的行为;我只声称它有您需要的类型。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51067056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档