Перегруженные строки в simple-mysql - PullRequest
1 голос
/ 06 марта 2012

Это дополнительный вопрос к этому: Синтаксическая путаница (блок do) Так что, пожалуйста, смотрите его для получения дополнительной информации и оригинального кода. После того, как мне любезно помогли, я обнаружил еще одну проблему, которая, как я подозреваю, вызвана "перегруженными строками", что бы это ни значило.

Похоже, что библиотека 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 ]

1 голос
/ 06 марта 2012

Я понимаю, что вы уже прошли через это, но чтобы более полно ответить на ваш вопрос:

mysql-simple дает Query экземпляр для класса типов 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.)

1 голос
/ 06 марта 2012

Вы можете заключить строковый литерал в несколько строк, добавив обратную косую черту в конце строки и другую обратную косую черту, где строка должна продолжаться, поэтому вы можете написать свой пример следующим образом:

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