Как конвертировать (Integer, Int, Int) в день.Не удалось сопоставить ожидаемый тип 'Day' с фактическим типом '(Integer, Int, Int)' - PullRequest
0 голосов
/ 03 июня 2018
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.Задача: вычесть из (castDay - retrievedDay), но я не могу этого сделать, поскольку мне нужно преобразовать retrievedDate в Day

Сообщение об ошибке: не удалось сопоставить ожидаемый тип 'Day' с фактическим типом '(Integer,Int, Int) '

42 |let diifedDays = diffDays (fromJust forecastDay) retrievedDate

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Чтобы исправить ошибку, просто удалите toGregorian, и она точно проверит тип.

Возможно, вы захотите поработать над своей логикой.

0 голосов
/ 03 июня 2018

Ну, на самом деле вы уже получили объект 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 с и т. Д. Поэтому я бы хотелочень советую вам его почистить.

...