Haskell 中如何将构造函数转换为字符串?
How to convert from a constructor to a string in Haskell?
我正在尝试以字符串格式输出一手牌,但我不能从牌的等级中删除单词 "Numeric",我更愿意在没有辅助函数的情况下这样做,因为它看起来真的很乱,任何建议都可以在没有辅助功能的情况下执行此操作。此外,当我使用 display
函数时,我在 Prelude 中使用了 putStr (display x)
。这是到目前为止的代码:
displayCard :: Card -> String
displayCard c = show (rank c) ++ " of " ++ show (suit c) ++ "\n"
display :: Hand -> String
display Empty = "\n"
display (Add c h) = displayCard c
++ display h
displayRank :: Rank -> String
displayRank (Numeric 2) = "2"
displayRank (Numeric 3) = "3"
displayRank (Numeric 4) = "4"
displayRank (Numeric 5) = "5"
displayRank (Numeric 6) = "6"
displayRank (Numeric 7) = "7"
displayRank (Numeric 8) = "8"
displayRank (Numeric 9) = "9"
displayRank (Numeric 10) = "10"
displayRank Jack = "Jack"
displayRank Queen = "Queen"
displayRank King = "King"
displayRank Ace = "Ace"
你用 show (rank c)
、
完成的事情
rank :: Card -> Rank
show :: Rank -> String
你可以用 displayRank (rank c)
完成
rank :: Card -> Rank
displayRank :: Rank -> String
(说到类型)。
I would prefer to do this without a helper function because it seems really messy
假设您有类似以下类型的内容,
data Card = Card { cardRank :: Rank, cardSuit :: Suit }
deriving (Eq, Show)
data Rank = Numeric Int | Jack | Queen | King | Ace
deriving (Eq, Show)
data Suit = Diamonds | Clubs | Hearts | Spades
deriving (Eq, Show)
那么编写辅助函数就有意义了
displayRank :: Rank -> String
displayRank (Numeric n) = show n
displayRank otherRank = show otherRank
displaySuit :: Suit -> String
displaySuit = show
displayCard :: Card -> String
displayCard (Card rank suit) = ...
但您也可以将它们组合起来:
displayCard :: Card -> String
displayCard (Card (Numeric n) suit) = ...
displayCard (Card otherRank suit) = ...
正确设计辅助函数并不麻烦。相反。
我正在尝试以字符串格式输出一手牌,但我不能从牌的等级中删除单词 "Numeric",我更愿意在没有辅助函数的情况下这样做,因为它看起来真的很乱,任何建议都可以在没有辅助功能的情况下执行此操作。此外,当我使用 display
函数时,我在 Prelude 中使用了 putStr (display x)
。这是到目前为止的代码:
displayCard :: Card -> String
displayCard c = show (rank c) ++ " of " ++ show (suit c) ++ "\n"
display :: Hand -> String
display Empty = "\n"
display (Add c h) = displayCard c
++ display h
displayRank :: Rank -> String
displayRank (Numeric 2) = "2"
displayRank (Numeric 3) = "3"
displayRank (Numeric 4) = "4"
displayRank (Numeric 5) = "5"
displayRank (Numeric 6) = "6"
displayRank (Numeric 7) = "7"
displayRank (Numeric 8) = "8"
displayRank (Numeric 9) = "9"
displayRank (Numeric 10) = "10"
displayRank Jack = "Jack"
displayRank Queen = "Queen"
displayRank King = "King"
displayRank Ace = "Ace"
你用 show (rank c)
、
rank :: Card -> Rank
show :: Rank -> String
你可以用 displayRank (rank c)
rank :: Card -> Rank
displayRank :: Rank -> String
(说到类型)。
I would prefer to do this without a helper function because it seems really messy
假设您有类似以下类型的内容,
data Card = Card { cardRank :: Rank, cardSuit :: Suit }
deriving (Eq, Show)
data Rank = Numeric Int | Jack | Queen | King | Ace
deriving (Eq, Show)
data Suit = Diamonds | Clubs | Hearts | Spades
deriving (Eq, Show)
那么编写辅助函数就有意义了
displayRank :: Rank -> String
displayRank (Numeric n) = show n
displayRank otherRank = show otherRank
displaySuit :: Suit -> String
displaySuit = show
displayCard :: Card -> String
displayCard (Card rank suit) = ...
但您也可以将它们组合起来:
displayCard :: Card -> String
displayCard (Card (Numeric n) suit) = ...
displayCard (Card otherRank suit) = ...
正确设计辅助函数并不麻烦。相反。