在Haskell中如何对自定义数据类型进行类型检查?
你代码报错的核心原因是Rank类型的定义不符合预期。你当前写的data Rank = Int | Jack | Queen | King | Ace中,Int是一个无参的自定义数据构造器,和Haskell内置的整数类型Int没有任何关联,自然无法用(Int i)的模式匹配拿到数值。
修正方案
- 首先调整
Rank类型定义,给数字点数的构造器增加Int类型的参数,建议将构造器命名为Num避免和内置的Int类型名产生歧义:
data Rank = Num Int | Jack | Queen | King | Ace data Suit = Club | Diamond | Heart | Spade data Card = Card Rank Suit
- 对应修改
valueOfRank函数的模式匹配逻辑即可正常运行:
getCardValue :: Card -> Int getCardValue (Card val _) = valueOfRank val valueOfRank :: Rank -> Int valueOfRank (Num i) = i valueOfRank Jack = 10 valueOfRank Queen = 10 valueOfRank King = 10 valueOfRank Ace = 11
注意事项
- 如果你非要保留
Int作为构造器名也可以实现功能,但会引发命名冲突、可读性大幅下降的问题,非常不推荐该写法:
-- 不推荐,存在命名冲突 data Rank = Int Int | Jack | Queen | King | Ace valueOfRank :: Rank -> Int valueOfRank (Int i) = i
- 额外可以补充合法点数校验逻辑,避免构造出
Num 1、Num 12这类不符合21点规则的卡牌点数。
内容的提问来源于stack exchange,提问作者user14978390
相关产品推荐
相关产品推荐

