为什么我不能将我从函数parseTimeM收到的日期与符号> =?进行比较?

时间:2018-05-31 18:18:03

标签: haskell time haskell-stack

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函数? 这个功能可以使用过去的日期和未来的日期吗?

1 个答案:

答案 0 :(得分:2)

由于forecastDayMaybe 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应该只等于date9999-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