当您静态知道年 + 月 + 日期有效时,如何在 Purescript 中简洁地创建日期


Data.Date.canonicalDate

构造一个Date值,但你需要一个YearMonthDay值作为参数:

  • 由于Month是静态已知的,因此您可以对其进行硬编码:例如June
  • 但是,YearDay不能硬编码,即使您静态地知道它们。你必须打电话给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'

有没有更简单的方法?

如果你可以接受在年份和/或日期超出范围时崩溃(我强烈建议你重新考虑这个决定(,那么你可以使用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

这样,至少你的消费者会知道该功能确实是部分的。

最新更新