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'
有没有更简单的方法?
如果你可以接受在年份和/或日期超出范围时崩溃(我强烈建议你重新考虑这个决定(,那么你可以使用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
这样,至少你的消费者会知道该功能确实是部分的。