我的逻辑出了什么问题?

时间:2011-11-08 01:30:14

标签: haskell persistent yesod

>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 not 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!!!! "

1 个答案:

答案 0 :(得分:1)

这是一个难以复制的问题所以我写的是一个非常疯狂的猜测,但是这里有:

让我们从最终结果向后工作

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

这一行清楚地评估了then条件。 Ergo (L.null match == True)True。我的第一个问题是为什么== True条款? L.null match本身应该也能正常运作。

现在我们知道L.null match必须是True,但上面的行似乎表明match包含一条记录。所以在这一点上我会怀疑L.null可能不是你认为的功能,或者匹配不包含输出导致我们相信它的功能。我的下一个调试建议是针对其他一些属性测试match(是否有长度函数?)并查看问题是L.null还是match。另一个想法是在if之后移动print语句。这不应该改变任何东西(肯定不会改变Haskell!),但数据库查询的响应偶尔会怪异。 (例如,不是列表,而是结果的,在使用时会被消耗掉。)

祝你好运!