2014-02-21 4 views
2

Обучение F # путем написания блэкджек. У меня есть эти типы:Как сделать выражение этого совпадения более кратким?

type Suit = 
| Heart = 0 
| Spade = 1 
| Diamond = 2 
| Club = 3 

type Card = 
| Ace of Suit 
| King of Suit 
| Queen of Suit 
| Jack of Suit 
| ValueCard of int * Suit 

У меня есть эта функция (игнорируя пока что тузы могут иметь 2 разных значения):

let NumericValue = 
    function | Ace(Suit.Heart) | Ace(Suit.Spade) | Ace(Suit.Diamond) | Ace(Suit.Club) -> 11 
     | King(Suit.Heart) | King(Suit.Spade)| King(Suit.Diamond) | King(Suit.Club) | Queen(Suit.Heart) | Queen(Suit.Spade)| Queen(Suit.Diamond) | Queen(Suit.Club) | Jack(Suit.Heart) | Jack(Suit.Spade)| Jack(Suit.Diamond) | Jack(Suit.Club) -> 10 
     | ValueCard(num, x) -> num 

Есть ли способ я могу включать в себя диапазон или что-то? Как [Ace (Suit.Heart) .. Ace (Suit.Club)]. Или даже лучше Ace (*)

ответ

6

Вы хотите модель подстановочные знаки. Спектр (§7.4) гласит:

Образец _ является шаблоном подстановки и соответствует любому входу.

let numericValue = function 
| Ace _-> 11 
| King _ 
| Queen _ 
| Jack _ -> 10 
| ValueCard(num, _) -> num 
+0

Желаю. Компилятор сообщает мне, что Ace является конструктором; он не может использоваться сам по себе. – dudeNumber4

+0

@ dudeNumber4 вы уверены, что ставите подстановочный знак после Ace? –

+1

@MatthewMcveigh, дерьмо, вот что я пропал без вести! – dudeNumber4

Смежные вопросы