我对函数式编程非常陌生,我几乎没有以下自定义数据类型来代表一副纸牌。
西装的数据类型
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”:
我想要达到的目标:
[当我读取“ S3HA”的字符串时,我希望输出是一个数组]]
[Card Spade Three, Card Heart Ace]
请指教!我对Haskell函数编程比较陌生!
而且我不想修改上述Card
,Suit
和Rank
的自定义数据类型的源代码,而是利用这些数据类型创建[Card]
的数组。任何人都可以提供将字符串解析为[Card]
的方法吗?
我对函数式编程非常陌生,我几乎没有以下自定义数据类型来代表一副纸牌。西装数据的数据类型西装=黑桃|俱乐部|钻石|心衍生(...
正如@chi在问题注释中所说,实现目标的最直接方法是为readList
定义Card
方法。