Ошибка типа для строки запроса с 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
имеет поведение, которое вам нужно; Я утверждаю только, что он имеет тип, который вам нужен.