#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
.