簡體   English   中英

如何在 Haskell 中將構造函數轉換為字符串?

[英]How to convert from a constructor to a string in Haskell?

我正在嘗試 output 一手字符串格式的卡片,但我不能從卡片的等級中刪除“數字”這個詞,我寧願在沒有助手 function 的情況下這樣做,因為它看起來真的很亂,任何建議在沒有助手 function 的情況下執行此操作。 另外,當我使用display function 時,我在 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"

我寧願在沒有助手 function 的情況下這樣做,因為它看起來真的很亂

假設您有以下類型,

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) = ...

擁有正確設計的輔助函數並不混亂。 相反。

你用show (rank c)完成了什么,

rank ::        Card -> Rank
show ::                Rank -> String

您可以使用displayRank (rank c)完成

rank ::        Card -> Rank
displayRank ::         Rank -> String

(說到類型)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM