Haskell中如何处理无匹配牌型的Hand?value函数otherwise=0可行吗?
Haskell中
value :: Hand -> Int函数的实现疑问解答 首先纠正你代码里的语法问题,Haskell的函数模式匹配需要明确匹配数据构造器,正确的基础结构应该是这样:
data Hand = PairOf Rank | ThreeOf1 Rank | ThreeOf2 Suit value :: Hand -> Int value (PairOf r) = -- 在这里实现对子手牌的数值计算逻辑 value (ThreeOf1 r) = -- 在这里实现按Rank定义的三条的数值计算逻辑 value (ThreeOf2 s) = -- 在这里实现按Suit定义的三条的数值计算逻辑 value _ = 0
关于“不属于三种构造器的手牌”的说明
你定义的Hand是代数数据类型(ADT),它的所有可能取值就是你列出的PairOf、ThreeOf1、ThreeOf2这三种构造器对应的实例,不存在“不属于这三者的手牌组合”——ADT的取值范围完全由你声明的构造器决定,没有额外的默认情况。
关于otherwise = 0的合理性
你当前写的otherwise = 0语法不对,但如果是想用一个默认分支覆盖所有未明确匹配的情况,用通配符_ = 0是可行的:
- 如果你后续给
Hand类型新增构造器,这个默认分支能避免函数出现“非穷尽模式匹配”的编译警告,确保函数始终能返回值; - 注意
otherwise本质是True的别名,一般用于条件判断分支(比如if ... otherwise ...或者case里的条件模式),在模式匹配的函数分支里,用通配符_才是标准写法。
内容的提问来源于stack exchange,提问作者user20549332
相关产品推荐
相关产品推荐

