我有這樣的代碼來檢查日期是否有效
isKabisat :: Int -> Bool
isDateValid :: Int -> Int -> Int -> Bool
isKabisat y = ((mod y 400)==0) || ((mod y 100 )/=0 && (mod y 4)==0)
isDateValid d m y =
if (y>=1900 && y<=1999) then
if (m==1) || (m==3) || (m==5) || (m==7) || (m==8) || (m==10) || (m==12) then
(d>=1 && d<=31)
else if (m==2) then
(d>=1) && (d<=(if isKabisat y then 29 else 28))
else if (m==4) || (m==6) || (m==9) || (m==11) then
(d>=1) && (d<=30)
但為什么它回傳決議錯誤:(
uj5u.com熱心網友回復:
在 Haskell 中,if ...是一個運算式;它必須具有else,以便if即使不滿足條件,運算式作為一個整體也可以計算為某個值:
module Main where
isKabisat :: Int -> Bool
isKabisat y = ((mod y 400)==0) || ((mod y 100 )/=0 && (mod y 4)==0)
isDateValid :: Int -> Int -> Int -> Bool
isDateValid d m y =
if (y>=1900 && y<=1999) then
if (m==1) || (m==3) || (m==5) || (m==7) || (m==8) || (m==10) || (m==12) then
(d>=1 && d<=31)
else if (m==2) then
(d>=1) && (d<=(if isKabisat y then 29 else 28))
else if (m==4) || (m==6) || (m==9) || (m==11) then
(d>=1) && (d<=30)
else False
else False
main = do
print $ isDateValid 26 1 1999 -- True
print $ isDateValid 29 2 1999 -- False
我想代碼可以通過使用警衛來簡化elem:
isDateValid :: Int -> Int -> Int -> Bool
isDateValid d m y
| y < 1900 || y > 1999 || d < 1 = False
| m `elem` [1,3,5,7,8,10,12] = d <= 31
| m `elem` [4,6,9,11] = d <= 30
| m == 2 = d <= if isLeapYear then 29 else 28
| otherwise = False
where isLeapYear = y `mod` 400 == 0 || (y `mod` 100 /= 0 && y `mod` 4 == 0)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/423002.html
標籤:
上一篇:在JavaScript中將命題公式轉換為合取范式的演算法實作?
下一篇:堆組態檔中的微量元素是什么?
