Как получить значение из типа - PullRequest
0 голосов
/ 22 марта 2019

У меня есть этот тип

type Card = (CardValue,Suite)

Я хочу написать функцию для отображения цвета на основе Card.Suite значения

colour :: Card -> Colour
colour card = if card.Suite == Spades then Red else Black

Этот код просто иллюстрирует то, чего я хочу достичь.Я не знаю, как на самом деле получить набор значений от Card(CardValue,Suite).

Ответы [ 2 ]

7 голосов
/ 22 марта 2019

Ключевое слово type объявляет новый тип synonim, а не новый тип.В вашем коде Card - это просто набор CardValue и Suite.

. Чтобы получить доступ к элементам пары, используйте fst и snd:

colour card = if snd card == Spades then Red else Black

илишаблон соответствует аргументу:

colour (value,suite) = if suite == Spades then Red else Black
4 голосов
/ 22 марта 2019

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...