Как я могу проверить пользовательские типы данных в Haskell?

#haskell

Вопрос:

Я очень новичок в Хаскелле, так что заранее прошу прощения.

Я пишу программу, которая имеет пользовательский тип «Ранг». (Ранг блэкджек-карты)

 data Rank = Int | Jack | Queen | King | Ace  data Suit = Club | Diamond | Heart | Spade  data Card = Card Rank Suit   getCardValue :: Card -gt; Int getCardValue (Card val _) = valueOfRank val  valueOfRank :: Rank -gt; Int valueOfRank (Int i) = i --Doesnt work valueOfRank Jack = 10 valueOfRank Queen = 10 valueOfRank King = 10 valueOfRank Ace = 11  

Теперь я хочу получить соответствующее значение карты с функцией, моя проблема в том, что я не знаю, как проверить, соответствует ли значение типу Int.

Ответ №1:

 data Rank = Int | Jack | Queen | King | Ace  

Выше Int указано имя конструктора данных, и оно совершенно не связано с Int типом. Действительно, Jack это аналогичный конструктор данных, но вокруг нет Jack типа.

Если вам нужно Rank значение , фактически содержащее значение типа Int , вам нужно использовать что-то вроде

 data Rank = I Int | Jack | Queen | King | Ace  

Вот I имя конструктора (вы можете переименовать его по своему усмотрению), и Int теперь оно относится к типу. Затем вы можете использовать Rank в качестве:

 valueOfRank :: Rank -gt; Int valueOfRank (I i) = i valueOfRank Jack = 10 valueOfRank Queen = 10 valueOfRank King = 10 valueOfRank Ace = 11  

Обратите внимание, что ничто не мешает программисту злоупотреблять I конструктором и создавать недопустимые значения карт , такие как I 123 , I 11 , и I 1 .