Haskell如何计算下一个工作日?代码报错怎么解决?如何自动缩进?
代码存在的问题
你提供的代码存在三类核心错误,完全无法编译运行,也不符合需求:
- 变量使用错误:函数参数为
day但代码全程没有引用该参数,反而使用了未定义的变量x;同时let x = ...定义的是then分支内的局部变量,外部作用域完全无法访问,逻辑完全不成立。 - 语法结构错误:Haskell中
if是必须配对else的表达式而非过程语句,你当前写的多个串行无配对else的if不符合语法要求,且末尾else后额外加then属于明显语法错误。 - 业务逻辑错误:需求是返回下一个工作日(跳过周六、周日),你的代码即使修复语法问题,实现的也是返回当前的下一天,例如周五的返回值为周六,完全不符合需求。
修复后的正确实现示例(使用Haskell模式匹配特性,更简洁易读):
-- | 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 Friday = Monday nextWeekday Saturday = Monday nextWeekday Sunday = Monday nextWeekday Monday = Tuesday nextWeekday Tuesday = Wednesday nextWeekday Wednesday = Thursday nextWeekday Thursday = Friday
Haskell代码自动缩进格式化方法
你可以使用成熟的格式化工具实现一键自动格式化:
- 社区首推无配置工具
ormolu,安装完成后执行命令ormolu --mode inplace 目标文件.hs即可自动修正缩进、空格等所有格式问题,符合Haskell社区通用编码规范。 - 若需要少量自定义格式规则,可以使用
fourmolu,它是ormolu的衍生版本,支持通过配置文件调整格式规则。 - 如果你使用Stack或Cabal管理项目,可以将格式化工具配置为构建前置钩子,每次构建项目时自动执行格式化操作。
内容的提问来源于stack exchange,提问作者proceeder
相关产品推荐
相关产品推荐

