Haskell能否通过模式匹配实现order函数重载及分支执行优先级问题
回答
1. 模式匹配实现的合理性说明
首先明确:你这种写法不属于Haskell的函数重载,Haskell的重载(即特设多态)是通过类型类(Typeclass)实现的,你这里用的是单函数的多分支模式匹配,属于Haskell的常规语法。
这个写法本身逻辑是可行的,优势很明显:把通用的余额校验逻辑放在最上层,避免每个Food类型分支都重复写校验代码,减少冗余。但存在两个可优化的点:
- 你的
Order类型本身已经包含CreditBalance字段,但函数参数额外传了一个CreditBalance组成二元组,属于设计冗余,建议确认是否需要保留两份余额参数,大概率可以简化为order :: Order -> OrderStatus,直接读取订单内的余额字段即可。 - 第一个分支你用
O{}通配了所有Order值,如果后续不需要修改上层通用逻辑,这个结构是完全没问题的,后续要加其他通用校验也可以统一放在最上层的分支守卫中。
2. 第一个分支的触发逻辑说明
第一个分支一定会被优先匹配,不会被下方的分支覆盖,具体执行逻辑如下:
所有输入参数都会先命中第一个分支的模式(O {}, balance),之后进入守卫判断:
- 如果余额不满足
checkBalance要求(即not (checkBalance balance)为真),直接返回Declined,不会走到下方的Food类型分支。 - 如果余额满足要求,当前守卫不成立,会先检查第一个分支后续的其他守卫(你代码中写
...的部分),如果所有上层守卫都不匹配,才会自动往下匹配后续按Food类型拆分的分支。
内容的提问来源于stack exchange,提问作者CoffeeKid
相关产品推荐
相关产品推荐

