有没有办法在Haskell的列表中加一个Enum Bounded Ord类型?

时间:2014-09-11 13:02:50

标签: haskell

我有以下数据类型:

data Suit = Club | Diamond | Heart | Spade
      deriving (Eq, Ord, Bounded, Enum)

data Rank =
R2 | R3 | R4 | R5 | R6 | R7 | R8 | R9 | R10 |
Jack | Queen | King | Ace
    deriving (Eq, Ord, Bounded, Enum)

data Card = Card {suit::Suit, rank::Rank}
      deriving (Eq, Bounded)

现在有一个[Card]列表。有没有办法让我在列表中加上Rank某个Card加一个?例如,给定列表[Card Club R2, Card Club R2]我想将其设为[Card Club R3, Card Club R3]。我写了以下代码:

-- | Update certain number of cards' rank in the list.
updateRankList :: Int -> [Card] -> [Card]

updateRankList num (x : xs)
    | num == 0  = []
    | otherwise = updateRank x ++ updateRankList (num - 1) xs

-- | Update a card's rank, didn't finish.
updateRank :: Card -> Card

updateRank card = 

我被困住了。谁能帮我?谢谢。

2 个答案:

答案 0 :(得分:0)

:info Enum

非常实用!我正在寻找的功能是succ,谢谢你们。

答案 1 :(得分:0)

你可以为Bounded和Enum类型创建一个包装succ:

 succWrap x = if x == maxBound then minBound else succ x

然后你需要

 updateRanks n xs = map succWrap (take num xs) ++ drop num xs