读取错误为Prelude.read的自定义数据类型:未解析

问题描述 投票:1回答:1

我对函数式编程非常陌生,我几乎没有以下自定义数据类型来代表一副纸牌。

西装的数据类型

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

instance Show Suit where
  show Spade = "S"
  show Club = "C"
  show Diamond = "D"
  show Heart = "H"

instance Read Suit where
  readsPrec _ [] = []
  readsPrec _ (s: str) = case s of
    'S' -> [(Spade, str)]
    'C' -> [(Club, str)]
    'D' -> [(Diamond, str)]
    'H' -> [(Heart, str)]
    _ -> []

排名的数据类型

data Rank = Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten
          | Jack | Queen | King | Ace
  deriving (Eq, Ord, Enum, Bounded)

instance Show Rank where
  show Ace = "A"
  show King = "K"
  show Queen = "Q"
  show Jack = "J"
  show rank = show $ fromEnum rank + 2

instance Read Rank where
  readsPrec _ [] = []
  readsPrec _ (s: str) = case s of
      'A' -> [(Ace, str)]
      'K' -> [(King, str)]
      'Q' -> [(Queen, str)]
      'J' -> [(Jack, str)]
      _   -> readNum
    where
      readNum
        | s >= '2' && s <= '9' = [(toEnum (ord s - ord '2') :: Rank, str)]
        | s == '1' = readZero str -- Read a following 0
        | otherwise = []
      readZero ('0': rest) = [(Ten, rest)]
      readZero _ = []

卡的数据类型

data Card = Card Suit Rank
  deriving (Eq)

instance Show Card where
  show (Card suit rank) = show suit ++ show rank

instance Read Card where
  readsPrec _ str = do
     (s, rest) <- reads str
     (r, end) <- reads rest
     return (Card s r, end)

当我在堆栈ghci控制台中键入read "S3H5" :: Card时,它显示*** Exception: Prelude.read: no parse的异常错误。

请问如何解决这个问题?

我有一个卡信息字符串,例如代表两个卡的“ S3HA”:

  • 黑桃三
  • Heart Ace

我想要达到的目标:

[当我读取“ S3HA”的字符串时,我希望输出是一个数组]]

[Card Spade Three, Card Heart Ace]

请指教!我对Haskell函数编程比较陌生!

而且我不想修改上述CardSuitRank的自定义数据类型的源代码,而是利用这些数据类型创建[Card]的数组。任何人都可以提供将字符串解析为[Card]的方法吗?

我对函数式编程非常陌生,我几乎没有以下自定义数据类型来代表一副纸牌。西装数据的数据类型西装=黑桃|俱乐部|钻石|心衍生(...

haskell functional-programming monads functor applicative
1个回答
0
投票

正如@chi在问题注释中所说,实现目标的最直接方法是为readList定义Card方法。

© www.soinside.com 2019 - 2024. All rights reserved.