haskell - 如何在 Haskell 中对自定义数据类型进行类型检查?
问题描述
我对haskell很陌生,所以提前抱歉。
我正在编写一个具有自定义类型“Rank”的程序。(二十一点牌的等级)
data Rank = Int | Jack | Queen | King | Ace
data Suit = Club | Diamond | Heart | Spade
data Card = Card Rank Suit
getCardValue :: Card -> Int
getCardValue (Card val _) = valueOfRank val
valueOfRank :: Rank -> Int
valueOfRank (Int i) = i --Doesnt work
valueOfRank Jack = 10
valueOfRank Queen = 10
valueOfRank King = 10
valueOfRank Ace = 11
现在我想接收带有函数的卡片的相应值,我的问题是,我不知道如何对值是否为 Int 类型进行类型检查。
解决方案
data Rank = Int | Jack | Queen | King | Ace
以上Int
是数据构造函数名称,与Int
类型完全无关。实际上,Jack
是一个类似的数据构造函数,但没有Jack
类型。
如果您想要一个Rank
实际包含类型值的值Int
,则需要使用类似
data Rank = I Int | Jack | Queen | King | Ace
这I
是构造函数名称(您可以根据需要重命名),Int
现在指的是type。然后,您可以Rank
用作:
valueOfRank :: Rank -> Int
valueOfRank (I i) = i
valueOfRank Jack = 10
valueOfRank Queen = 10
valueOfRank King = 10
valueOfRank Ace = 11
请注意,没有什么能阻止程序员滥用I
构造函数并创建无效的卡片值,如I 123
、I 11
和I 1
。
推荐阅读
- class - 网站 html 检查器 wc3validator 但显示致命错误
- android - GLTF 物体在加载时接地
- javascript - 将带有图像和标题的元标记添加到 Angular 6 项目
- android - 如何在 Android Studio 中从 Firebase 实时数据库中的 URL 检索图像
- python - python中的lzss.decode()没有给出正确的输出
- javascript - 仅打开一个带有角度的弹出选项卡
- sql - 如果没有找到 SQL 查询返回列 null
- reactjs - React JS 导航栏标题元素类型无效
- javascript - ESTree 中使用什么语言来描述抽象语法树?
- c# - 无法将具有枚举属性的对象从存储库项目传递到服务结构服务