type Card = (CardValue, Suit)
делает Card
псевдонимом типа для набора данных CardValue
и Suit
. Возможно, это не самая лучшая структура данных (элемент data
, использующий синтаксис записей, кажется лучше), но тривиально делать то, что вы хотите:
data Suit = Spades | Clubs | Hearts | Diamonds
data Color = Red | Black
type Card = (CardValue, Suit)
getSuitColor :: Card -> Color
getSuitColor (_, Spades) = Black
getSuitColor (_, Clubs) = Black
getSuitColor _ = Red
Или вы можете использовать охранников, чтобы сделать то же самое
getSuitColor :: Card -> Color
getSuitColor (_, suit)
| suit == Spades = Black
| suit == Clubs = Black
| otherwise = Red
Однако вам придется использовать deriving Eq
на вашем Suit
, чтобы сделать это (поскольку в противном случае вы не сможете ==
это!)
Если бы это был я, я бы, вероятно, использовал тот синтаксис записи, о котором я упоминал выше
data Card { rank :: CardValue
, suit :: Suit
}
Что означает, что вы должны создать свои Card
с, так как они являются отдельными типами.
myOldCard = (3, Spades)
myNewCard = Card 3 Spades
Но это означает, что у вас есть готовые поиски в них.
getColor :: Card -> Color
getColor = determineColor . suit
where
determineColor :: Suit -> Color
determineColor Spades = Black
determineColor Clubs = Black
determineColor _ = Red