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'
有更简单的方法吗?
答案 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
这样,至少你的消费者会知道这个功能真的很偏僻。