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

OverloadedStringstype のすべての用語ではなく、文字列リテラルにのみ影響しますStringStringリテラルではない がある場合は、次を使用してIsString(たとえばQuery)の任意のインスタンスに明示的に変換できます。

fromString :: IsString a => String -> a

注意:必要な動作があるQueryかどうかを判断するために使用している他のライブラリについては十分に知りません。fromString私はそれがあなたが必要とするタイプを持っているとだけ主張します。

于 2018-06-27T17:07:39.700 に答える