在Haskell中匹配扑克牌的套装和排名

时间:2013-03-22 21:48:09

标签: haskell types

我需要一些Haskell功能的实现方面的帮助,该功能应该与扑克牌相匹配 - 即“黑桃王牌”,“钻石2”,“杰克之心”。请注意,“s”的复数不能是Suit中构造函数名称的一部分。

参考:http://en.wikipedia.org/wiki/Standard_52-card_deck#Rank_and_color

到目前为止,这是我的代码:

data Suit = Club | Diamond | Heart | Spade
    deriving (Show, Ord)

data Rank = Ace | Zwei | Drei | Vier | Fuenf
| Sechs | Sieben | Acht | Neun | Zehn 
| Jack | Queen | King 
    deriving (Show, Enum, Read, Eq, Ord)

data Card = Card {rank :: Rank,
                suit :: Suit}
     deriving (Show, Read, Ord)

所需的功能应该是“match :: Card - > String”类型,产生类似“Ace of Diamond +”s“”的消息

2 个答案:

答案 0 :(得分:5)

match c = show (rank c) ++ " of " ++ show (suit c) ++ "s"

答案 1 :(得分:3)

尝试

match c = rankToString ++ " of " ++ show (suit c) ++ "s" where
    rankToString = case lookup (rank c) (zip [Two..Ten] [2..10]) of
        Just n -> show n
        Nothing -> show (rank c)

如果你真的想要2 of Spades而不是Two of Spades

有趣的练习是尝试用你知道的任何其他语言(如西班牙语或德语,而不是Java!)来执行此操作。在荷兰语中,在某些游戏中,9个黑桃有时被称为“nel”。你会如何处理?