在simple-mysql中重载了字符串

时间:2012-03-05 21:18:12

标签: haskell syntax casting literals

这是对此问题的跟进问题:Syntax confusion (do block)因此,请查看详细信息和原始代码。在我得到了善意的帮助之后,我发现了另一个问题,我怀疑这是由“过载的字符串”引起的。

看起来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 < ?)))"

2 个答案:

答案 0 :(得分:1)

你可以通过在行尾添加一个反斜杠和一个字符串应该继续的另一个反斜杠来将一个字符串文字包装在多行中,这样你就可以像这样编写你的例子:

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

答案 1 :(得分:1)

我认为你已经超越了它,但要更完整地回答你的问题:

mysql-simpleQuery类型类提供IsString个实例。当您在文件中键入字符串文字时,它将使用该实例中的fromString将其转换为它应该是的类型。

所以你可以这样做:

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

(并且(++)不适用于IsString a,仅适用于String,因此会将您的类型强制退回到String。)