Как кратко создать Date в Purescript, когда вы статически знаете, что год + месяц + дата действительны - PullRequest
0 голосов
/ 28 мая 2018

Data.Date.canonicalDate создает значение Date, но вам нужно значение Year, Month и Day в качестве аргументов:

  • Поскольку Month известно статически, выможно просто жестко закодировать его: например, June
  • Year и Day не могут быть жестко закодированы, даже если вы знаете их статически.Вы должны позвонить toEnum, и это даст вам Maybe Year / Maybe Day.

Мое текущее решение таково, что выглядит как сумасшедший хак:

hackyMakeDate :: Int -> Month -> Int -> Date
hackyMakeDate year month day = fromMaybe (canonicalDate bottom bottom bottom) maybeDate
  where
    maybeDate = do
      year' <- toEnum year
      day' <- toEnum day
      pure $ canonicalDate year' month day'

Есть ли более простой способ?

1 Ответ

0 голосов
/ 29 мая 2018

Если вас устраивает просто сбой, когда год и / или день выходят за пределы допустимого диапазона (решение, которое я настоятельно призываю вас переосмыслить), тогда вы можете использовать fromJust (что является частичнымфункция) вместе с unsafePartial, чтобы скрыть пристрастность:

makeDate :: Int -> Month -> Int -> Date
makeDate year month day = 
    unsafePartial $ fromJust $ 
       canonicalDate <$> toEnum year <@> month <*> toEnum day

Кроме того, вы можете не скрывать пристрастность:

partialMakeDate :: Partial => Int -> Month -> Int -> Date
partialMakeDate year month day = 
    fromJust $ 
       canonicalDate <$> toEnum year <@> month <*> toEnum day

Таким образом,по крайней мере ваши потребители будут знать, что функция действительно частичная.

...