import Data.Dates
succ.dateWeekDay<$>getCurrentDateTime
在线尝试!
这利用了以下事实:星期日是一周的最后一天。dateWeekDay
以WeekDay
类型返回星期几,简单定义为
data WeekDay = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday
WeekDay
是的实例Enum
,因此我们可以使用succ
和pred
获取工作日的后继者或前任者,例如succ Monday
yields Tuesday
。
但是,Sunday
它是最后一个枚举项,因此调用会succ Sunday
导致以下错误:
fail_on_sunday.hs: succ{WeekDay}: tried to take `succ' of last tag in enumeration
CallStack (from HasCallStack):
error, called at .\Data\Dates.hs:56:34 in dates-0.2.2.1-6YwCvjmBci55IfacFLnAPe:Data.Dates
编辑1:感谢-3个字节的nimi!
编辑2:-11个字节,因为现在允许使用功能。
完整程序:88 81 74 69 66字节
import Data.Dates
main=pure$!succ.dateWeekDay<$>getCurrentDateTime
在线尝试!
pure
需要将结果WeekDay
返回到IO Monad。但是,Haskell认为该程序不会以任何方式输出该值,因为它是如此的懒惰,所以不会对表达式求值,因此即使在星期日,程序也不会失败。这就是为什么$!
需要这样做的原因,即使Haskell通常不对表达式进行求值,也会强制求值。
以前的方法Data.Time
:127 124字节
import Data.Time.Clock
import Data.Time.Calendar.WeekDate
c(_,_,d)|d<7=d
main=getCurrentTime>>=(pure$!).c.toWeekDate.utctDay
在线尝试!这些是一些令人印象深刻的进口。更改d<7
为例如d/=5
在星期五测试失败。失败,但以下例外:Non-exhaustive patterns in function c
。