Что не так с моей логикой?

>main :: IO ()
 main = withPostgresqlConn "host=localhost user=Rocko port=5432 dbname=Rocko" $           runSqlConn $ do
   runMigration migrateAll
   let compDay = C.fromGregorian 2011 11 21
   match <- selectList
              [TestStartDate ==. compDay,
               TestEstimatedEnd ==. compDay,
               TestStatus /<-. [Passed,Failed]] []
   scheduled <- selectList [TestStatus ==. Scheduled] []
--   liftIO $ print scheduled
   liftIO $ print match
   if (L.null match == True) then (liftIO $ print "date available!!!! ") else (liftIO $       print "date not available")
   return ()

Я пытаюсь определить, соответствует ли конкретный день этим критериям: не равен TestStartDate, не равен TestEstimatedEnd, и ни Passed, ни Failed не является членом TestStatus.

Однако я хочу продемонстрировать, что выбранная мной дата (которая должна совпадать с TestEstimatedEnd) не работает правильно. Следует сказать: :дата недоступна. Так что не так с моей логикой?

> id |         firmware          |  version   | startDate  | estimatedEnd |  status

>----+---------------------------+------------+------------+--------------+-----------
  >1 | BCC Admin                 | 0.0.00.001 | 2011-11-19 | 2011-11-21   | Scheduled

>ghcifoo> main
 "date available!!!! "

person Michael Litchard    schedule 08.11.2011    source источник
comment
Чтобы уточнить: следует ли говорить, что дата доступна, когда нет подходящих дат?   -  person ivanm    schedule 08.11.2011
comment
Да, это то, что я хочу сделать.   -  person Michael Litchard    schedule 08.11.2011
comment
Являются ли условия в selectList конъюнктивными (&&) или дизъюнктивными (||)?   -  person Daniel Fischer    schedule 08.11.2011
comment
условия в selectList конъюнктивны.   -  person Michael Litchard    schedule 08.11.2011
comment
с постоянным, , означает &&   -  person Michael Litchard    schedule 08.11.2011
comment
Итак, вы ищете что-то с одинаковой датой начала и (предполагаемой) датой окончания, но задания обычно занимают несколько дней, поэтому совпадений нет.   -  person Daniel Fischer    schedule 08.11.2011
comment
Я сверяюсь с этими датами. compDay представляет пользовательский ввод. Я проверяю даты, уже находящиеся в базе данных. Я хочу убедиться, что compDay не является датой начала или окончания какой-либо другой работы.   -  person Michael Litchard    schedule 08.11.2011


Ответы (1)


Эту проблему трудно воспроизвести, поэтому то, что я пишу, является довольно дикой догадкой, но вот:

Давайте работать в обратном направлении от конечного результата

if (L.null match == True) then (liftIO $ print "date available!!!! ") else (liftIO $       print "date not available")

Эта строка явно оценивала условие then. Следовательно, (L.null match == True) было True. Мой первый вопрос: почему пункт == True? L.null match должен работать так же хорошо сам по себе.

Теперь мы знаем, что L.null match должно было быть True, но строка выше, похоже, указывает на то, что match содержит одну запись. Итак, на данный момент я подозреваю, что L.null, возможно, не та функция, о которой вы думаете, или match не содержит того, что вывод заставляет нас думать, что он содержит. Следующим моим предложением по отладке было бы проверить match на соответствие некоторым другим свойствам (может быть, есть функция длины?) и посмотреть, связана ли проблема с L.null или match. Еще одна мысль - переместить оператор печати после if. Это ничего не должно изменить (конечно, не в Haskell!), но ответ на запрос к базе данных иногда бывает странным. (например, не список, а поток результатов, которые потребляются по мере их использования.)

Удачи!

person John F. Miller    schedule 10.11.2011
comment
Эй, спасибо за советы по устранению неполадок. Я был в недоумении, как добраться до сути этого. - person Michael Litchard; 10.11.2011