import Data.Text
import Data.Time ( Day, UTCTime, getCurrentTime)
import Data.Time.Clock
import Data.Time.Calendar
import Data.Time.Format
getDateFromUser :: IO (Either UserError Date)
getDateFromUser = do
Prelude.putStrLn "Пожалуйста, укажите дату для прогноза в формате
ГГГГ-ММ-ДД:"
date <- Prelude.getLine
let forecastDay = parseTimeM True defaultTimeLocale "%Y-%m-%d" date :: Maybe Day
let currentTime = show forecastDay
if date >= currentTime
then return $ Right $ (Data.Text.pack date)
else return $ Left InvalidDate
开始
~/Weather-report/Weather$ stack exec Weather-exe
Пожалуйста, укажите дату для прогноза в формате ГГГГ-ММ-ДД:
2018-05-31
InvalidDate
但是当我写这样的时候: date&lt; = currentTime ...
~/Weather-report/Weather$ stack exec Weather-exe
2018-05-31
Just "2018-05-31"
2018-05-30
Just "2018-05-30" and more
问题:为什么它不适用于&gt; = 为什么不起作用 也许是因为parseTimeM函数? 这个功能可以使用过去的日期和未来的日期吗?
答案 0 :(得分:2)
由于forecastDay
是Maybe Day
值,您希望包含Day
值的字符串表示形式,而不是Just
值的字符串表示形式。按字典顺序,任何以数字开头的字符串都将小于以J
开头的字符串。
一种选择是使用maybe
来应用show
或获取合适的默认字符串值。
getDateFromUser :: IO (Either UserError Date)
getDateFromUser = do
Prelude.putStrLn "Пожалуйста, укажите дату для прогноза в формате
ГГГГ-ММ-ДД:"
date <- Prelude.getLine
let forecastDay = parseTimeM True defaultTimeLocale "%Y-%m-%d" date :: Maybe Day
-- Instead of let currentTime = show forecastDay
let currentTime = maybe "9999-99-99" show forecastDay
if date >= currentTime
then return $ Right (Data.Text.pack date)
else return $ Left InvalidDate
鉴于currentTime
应该只等于date
或9999-99-99
,您所做的只是验证用户的输入。您只需使用
date <- Prelude.getLine
return case parseTimeM True defaultTimeLocale "%Y-%m-%d" date :: Maybe Day of
Just x -> Right (Data.Text.pack x)
Nothing -> Left InvalidDate