0
>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 匹配)未能做正确的事情。它应该说 :date 不可用。那么我的逻辑有什么问题呢?

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

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

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

1 回答 1

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.nullormatch上。另一个想法是将 print 语句移到if. 这不应该改变任何东西(当然不是在 Haskell 中!),但是来自数据库查询的响应有时很奇怪。(例如,不是一个列表,而是一个在使用时被消耗的结果流。)

祝你好运!

于 2011-11-10T06:29:31.310 回答