在 PureScript 中获取第二天的日期

Getting the date of the next day in PureScript

下面的函数有没有更优雅的写法?

我能看到一些模式,但我不确定如何抽象它们或如何找到更简单的方法来编写函数。

type HasRemainder = Boolean

tomorrow :: Date -> Date
tomorrow date = unsafePartial $ canonicalDate y (fst m) (fst d)
  where d :: Tuple Day HasRemainder
        d = case toEnum $ 1 + fromEnum (day date) of
          Just v -> Tuple v false
          Nothing -> Tuple (unsafePartial $ fromJust $ toEnum 1) true
        m :: Tuple Month HasRemainder
        m = if snd d then
              case toEnum $ 1 + fromEnum (month date) of
                Just v -> Tuple v false
                Nothing -> Tuple (unsafePartial $ fromJust $ toEnum 1) true
            else Tuple (month date) false
        y :: Year
        y = if snd m then
              case toEnum $ 1 + fromEnum (year date) of
                Just v -> v
                -- use 2018 arbitrarly if the conversion from int to Date fails
                Nothing -> unsafePartial $ fromJust $ toEnum 2018
            else (year date)

我会按照这些思路尝试一些东西

getDatePart datepart defaultval1 defaultval2 = 
    case toEnum $ defaultval1 + fromEnum datepart of
    Just v -> Tuple v false
    Nothing -> Tuple (unsafePartial $ fromJust $ toEnum defaultval2) true

getDatePartDefault d datepart defaultval1 defaultval2 =
    if snd d then
        getDatePart datepart defaultval1 defaultval2
    else Tuple datepart false


 tomorrow :: Date -> Date
 tomorrow date = unsafePartial $ canonicalDate (fst y) (fst m) (fst d)
     where d :: Tuple Day HasRemainder
           d = getDatePart (day date) 1 1
           m :: Tuple Month HasRemainder
           m = getDatePartDefault d (month date) 1 1
           y :: Tuple Year HasRemainder
           y = getDatePartDefault d (year date) 1 2018

注意:这还没有测试

我会这样做:

import Data.DateTime as DT
import Data.Maybe (maybe)
import Data.Time.Duration (Days(..))

tomorrow :: DT.Date -> DT.Date
tomorrow dt = maybe dt DT.date $ DT.adjust (Days 1.0) (DT.DateTime dt bottom)

尽管它会 return 在给定日期为 top(如果我没记错的话是 12 月 31 日 275759)的不太可能的情况下输入日期。

TimeDateTime 有一个 adjust 函数,所以 Date 缺少一个函数只是疏忽。