【问题标题】:Haskell How to find next day?Haskell 第二天怎么找?
【发布时间】:2021-10-02 21:27:57
【问题描述】:
-- | Days of week.
data Day = Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday deriving (Eq, Show)

-- | Returns the next weekday (excluding weekend, namely Saturday and Sunday).
nextWeekday :: Day -> Day
nextWeekday day = 
  if x == Sunday
    then let x = Monday
  if x == Monday 
    then let x = Tuesday
  if x == Tuesday
    then let x = Wednesday
  if x == Wednesday
    then let x = Thursday
  if x == Thursday
    then let x = Friday
  if x == Friday
    then let x = Saturday
  else
    then let x = Sunday

这是我现在的代码...此代码有什么问题...?如何自动缩进 Haskell 代码?

【问题讨论】:

标签: haskell


【解决方案1】:

Haskell 中的if … then … else …总是有一个else 子句,因为您编写了一个表达式,并且对于条件的两种可能结果,它应该返回一个值。

此外,您使用if <s>x</s> == Monday,但x 不是输入参数。您也可以使用let x = Monday,但是您需要使用in 子句。虽然let x = Monday in x 是有效的,但我们可以简单地使用Monday 而不是使用辅助变量x。 因此,您可以将其实现为:

nextWeekday :: Day -> Day
nextWeekday day = 
  if day == Sunday
    then Monday
  else if day == Monday 
    then Tuesday
  else if day == Tuesday
    then Wednesday
  else if day == Wednesday
    then Thursday
  else if day == Thursday
    then Friday
  else if day == Friday
    then Saturday
  else Sunday

然而,使用模式匹配通常比使用分支更好,因此我们可以将其实现为:

nextWeekDay :: Day -> Day
nextWeekDay Sunday = Monday
nextWeekDay Monday = Tuesday
nextWeekDay Tuesday = Wednesday
nextWeekDay Wednesday = Thursday
nextWeekDay Thursday = Friday
nextWeekDay Friday = Saturday
nextWeekDay Saturday = Sunday

【讨论】:

  • 更简单的方法是为Day 数据类型派生Enum 并使用succ,尽管您必须编写一个小的自定义函数来将其修改为从星期六开始“环绕”到周日。
  • @RobinZigmond:是的,我考虑在答案中提到这一点,但我想现在的练习是 OP 试图完成的重点更多的是语法而不是 Enum 类型类。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多