Ошибка типа для строки запроса с postgresql-simple

В связи с этим вопросом у меня есть шаблон запроса, который я построил с использованием interpolate пакет, который я потом пытаюсь передать query_ / execute_ функции от postgresql-simple, Но компилятор отказывается, с ошибкой

    • Couldn't match type ‘[Char]’ with ‘Query’
      Expected type: Query
      Actual type: String

Примечательный отрывок из doc-страниц для 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 здесь работают?

1 ответ

Решение

OverloadedStrings влияет только на строковые литералы, а не на все термины типа String, Если у тебя есть String который не является литералом, вы можете явно преобразовать его в любой экземпляр IsString (например Query) с помощью:

fromString :: IsString a => String -> a

NB Я не знаю достаточно о Query и другие библиотеки, которые вы используете, чтобы сказать, fromString имеет поведение, которое вам нужно; Я утверждаю только, что он имеет тип, который вам нужен.

Другие вопросы по тегам