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

时间:2018-05-28 19:47:16

标签: date 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'

有更简单的方法吗?

1 个答案:

答案 0 :(得分:2)

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

这样,至少你的消费者会知道这个功能真的很偏僻。