2011-11-08 82 views
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,並且通過不失敗是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

澄清:是否應該說沒有匹配日期的日期是可用的? – ivanm

+0

是的,這就是我想要做的。 –

+0

selectList中的條件是否連接(&&)或分離(||)? –

回答

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.nullmatch。另一個想法是在if之後移動打印語句。這不應該改變任何東西(當然不是在Haskell中!),但是來自數據庫查詢的響應偶爾會出現怪異的。 (例如,不是列表,而是因使用而被消耗的結果。)

祝你好運!

+0

嗨,感謝您的疑難解答提示。我對如何實現這一目標感到不知所措。 –