You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Haskell中如何对自定义数据类型进行类型检查?

你代码报错的核心原因是Rank类型的定义不符合预期。你当前写的data Rank = Int | Jack | Queen | King | Ace中,Int是一个无参的自定义数据构造器,和Haskell内置的整数类型Int没有任何关联,自然无法用(Int i)的模式匹配拿到数值。

修正方案

  1. 首先调整Rank类型定义,给数字点数的构造器增加Int类型的参数,建议将构造器命名为Num避免和内置的Int类型名产生歧义:
data Rank = Num Int | Jack | Queen | King | Ace

data Suit = Club | Diamond | Heart | Spade

data Card = Card Rank Suit
  1. 对应修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:24:05