首页 > 解决方案 > 如何在 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 类型进行类型检查。

标签: haskell

解决方案


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 123I 11I 1


推荐阅读