この質問に関連して、パッケージを使用して作成したクエリ テンプレートがあり、それを から/関数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
ここで働いていないのですか?