代码之家  ›  专栏  ›  技术社区  ›  user3928256

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

  •  0
  • user3928256  · 技术社区  · 10 年前

    我有以下数据类型:

    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 回复  |  直到 10 年前
        1
  •  0
  •   Ingo    10 年前

    可以对Bound和Enum类型进行换行:

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

    那么你只需要

     updateRanks n xs = map succWrap (take num xs) ++ drop num xs
    
        2
  •  0
  •   user3928256    10 年前
    :info Enum
    

    非常有用!我要找的功能是 succ ,谢谢各位。