2012-03-05 3 views
1

これは、これに続く質問です。Syntax confusion (do block)ですので、詳しい情報と元のコードはこちらをご覧ください。私が親切に助けられた後、私はもう一つの問題を発見しました。それは、それが意味することは何でも "オーバーロードされた文字列"によって引き起こされると思われます。シンプルmysqlのオーバーロードされた文字列

simple-mysqlライブラリは、文字列リテラルに対して何かを行うように見えます。そのため、パーサがタイプQueryであると理解できるようになります。これは彼らの例が示すものでもあります。ただし、すべての例では、コードをラップする必要がない、非現実的な短いクエリが使用されます。私はそれをラップする必要があります、そして、文字列の連結は結果の文字列がタイプQueryとして認識されないようにします。誰もがこの種のアプローチが有用であると判断したのは私の理解にとどまらず、私はこの任務を遂行したいと思っています...

だからこそ、文字列をクエリに変換できますか?

問題のコードとエラーを以下に示す:

-- Couldn't match expected type `Query' against inferred type `[a]' 
-- In the expression: 
--  "select count('*')" 
--  ++ "from table" 
--  ++ "where ((acquisition_date <= ?)" 
--   ++ "and ((sale_date is null) or " ++ "(sale_date < ?)))" 
-- In the definition of `countGoodsQuery': 
--  countGoodsQuery = "select count('*')" 
--      ++ "from table" 
--      ++ "where ((acquisition_date <= ?)" 
--       ++ "and ((sale_date is null) or " ++ "(sale_date < ?)))" 

countGoodsQuery :: Query 
countGoodsQuery = "select count('*')" ++ 
        "from table" ++ 
        "where ((acquisition_date <= ?)" ++ 
        "and ((sale_date is null) or " ++ 
        "(sale_date < ?)))" 
+0

あなたのタイプのエラーので、複数行のクエリの問題とは関係がありませんので、別の質問でそれについて質問してください。 – hammar

+0

ドキュメントをもう一度見てください。 'query_'はパラメータを取らないクエリです。それを 'query'で置き換えてください。それはうまくいくはずです(私は思っています)。 – hammar

+0

問題はありません:)私は編集をロールバックする自由を取った。他のエラーに関する質問がまだ残っている場合は、新しい質問を投稿してください。そんなに簡単ではない。 – hammar

答えて

1

あなたが行の最後にバックスラッシュを追加することにより、複数の行を横切ってリテラル文字列、および文字列が継続すべき別のバックスラッシュをラップすることができ、あなたはこのようなあなたの例を書くことができます

countGoodsQuery :: Query 
countGoodsQuery = "select count('*')\ 
        \from table\ 
        \where ((acquisition_date <= ?)\ 
        \and ((sale_date is null) or \ 
        \(sale_date < ?)))" 
1

私はあなたがすでに過去が、より完全にあなたの質問に答えるに着い集まる:

mysql-simpleIsString型のインスタンスをQueryに与えます。ファイルに文字列リテラルを入力すると、そのインスタンスのfromStringを使用して、それが想定されるタイプに変換されます。

だから、あなたと同じことを行うことができます:(。それは戻ってダウンStringにあなたのタイプを強制ので、IsString aにのみString機能しないと(++)

countGoodsQuery :: Query 
countGoodsQuery = fromString 
      ("select count('*')" ++ 
       "from table" ++ 
       "where ((acquisition_date <= ?)" ++ 
       "and ((sale_date is null) or " ++ 
       "(sale_date < ?)))") 

+1

うん、 'fromString'を明示的に使用すると、' OverloadedStrings'は必要ありません。 – Rusty

関連する問題