>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!!!! "
答案 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!),但数据库查询的响应偶尔会怪异。 (例如,不是列表,而是结果的流,在使用时会被消耗掉。)
祝你好运!