如何将 (Integer, Int, Int ) 转换为日。无法将预期类型“Day”与实际类型“(Integer, Int, Int)”相匹配
How to convert (Integer, Int, Int ) to Day. Couldn't match expected type ‘Day’ with actual type ‘(Integer, Int, Int)’
main :: IO ()
main = do
Prelude.putStrLn "Please,enter date YYYY-MM-DD"
currentTime <- getCurrentTime
date <- Prelude.getLine
let sTime = show currentTime
let retrievedDate = toGregorian $ utctDay currentTime
let forecastDay = parseTimeM True defaultTimeLocale "%Y-%-m-%-d" date :: Maybe Day
let diifedDays = diffDays (fromJust forecastDay) retrievedDate
if date >= show retrievedDate && diifedDays > 0 && diifedDays <= 16
then print date
else print "Time Error!"
我需要将 retrievedDate (Integer,Int,Int) 转换为 Day。
任务是:从 (forecastDay - retrievedDay) 中减去
但我不能这样做,因为我需要将 retrievedDate 转换为 Day
错误信息:
无法匹配预期类型“日”
实际类型为‘(Integer, Int, Int)’
42 |让 diifedDays = diffDays (fromJust forecastDay) retrievedDate
实际上你已经得到了一个 Day
对象,但是通过使用 toGregorian
,你将它转换成一个三元组 (Integer, Int, Int)
(根据 公历日历)。所以你实际上可以放弃 toGregorian
函数调用:
main :: IO ()
main = do
Prelude.putStrLn "Please,enter date YYYY-MM-DD"
currentTime <- getCurrentTime
date <- Prelude.getLine
let sTime = show currentTime
let retrievedDate = <b>utctDay currentTime</b>
let forecastDay = parseTimeM True defaultTimeLocale "%Y-%-m-%-d" date :: Maybe Day
let diifedDays = diffDays (fromJust forecastDay) retrievedDate
if date >= show retrievedDate && diifedDays > 0 && diifedDays <= 16
then print date
else print "Time Error!"
如果您需要将三元组转换回来,您可以使用 fromGregorian :: Integer -> Int -> Int -> Day
函数。对于三元组 (Integer, Int, Int)
,我们可以使用:
\(y, m, d) -> fromGregorian y m d
除此之外,您的代码给人留下了相当混乱的印象,其中有很多 let
语句、show
s 等。所以我真的建议您清理它。
您只需删除 toGregorian
即可修正您的错误,它会很好地进行类型检查。
尽管如此,您可能想要处理您的逻辑。
main :: IO ()
main = do
Prelude.putStrLn "Please,enter date YYYY-MM-DD"
currentTime <- getCurrentTime
date <- Prelude.getLine
let sTime = show currentTime
let retrievedDate = toGregorian $ utctDay currentTime
let forecastDay = parseTimeM True defaultTimeLocale "%Y-%-m-%-d" date :: Maybe Day
let diifedDays = diffDays (fromJust forecastDay) retrievedDate
if date >= show retrievedDate && diifedDays > 0 && diifedDays <= 16
then print date
else print "Time Error!"
我需要将 retrievedDate (Integer,Int,Int) 转换为 Day。 任务是:从 (forecastDay - retrievedDay) 中减去 但我不能这样做,因为我需要将 retrievedDate 转换为 Day
错误信息: 无法匹配预期类型“日” 实际类型为‘(Integer, Int, Int)’
42 |让 diifedDays = diffDays (fromJust forecastDay) retrievedDate
实际上你已经得到了一个 Day
对象,但是通过使用 toGregorian
,你将它转换成一个三元组 (Integer, Int, Int)
(根据 公历日历)。所以你实际上可以放弃 toGregorian
函数调用:
main :: IO ()
main = do
Prelude.putStrLn "Please,enter date YYYY-MM-DD"
currentTime <- getCurrentTime
date <- Prelude.getLine
let sTime = show currentTime
let retrievedDate = <b>utctDay currentTime</b>
let forecastDay = parseTimeM True defaultTimeLocale "%Y-%-m-%-d" date :: Maybe Day
let diifedDays = diffDays (fromJust forecastDay) retrievedDate
if date >= show retrievedDate && diifedDays > 0 && diifedDays <= 16
then print date
else print "Time Error!"
如果您需要将三元组转换回来,您可以使用 fromGregorian :: Integer -> Int -> Int -> Day
函数。对于三元组 (Integer, Int, Int)
,我们可以使用:
\(y, m, d) -> fromGregorian y m d
除此之外,您的代码给人留下了相当混乱的印象,其中有很多 let
语句、show
s 等。所以我真的建议您清理它。
您只需删除 toGregorian
即可修正您的错误,它会很好地进行类型检查。
尽管如此,您可能想要处理您的逻辑。