2014-02-12 2 views
0

Я понял, как я могу объявить тип данных другим типом данных. объявить тип данных типа данных в sml

т.е.
datatype suits = HEARTS | DIAMONDS 

datatype card = TWO of suits | THREE of suits 

fun value TWO of suits = 2 
    |value THREE of suits = 3 

Я хочу объявить тип данных другого типа данных. Тогда мне не нужно объявлять все 52 карты в колоде отдельно. Поэтому я подумал, что только объявляю значения карт как один тип данных, а цвет карт - как другой тип данных. Проблема возникает, когда я пытаюсь сопоставить карту типа данных с функцией. Мне нужно объявить значения цветов, также как HEARTS = 2 и DIAMONDS = 1, но когда я совпадаю, это не проблема. Я буду в состоянии отправить ДВА СЕРДЦА в функцию, подобную одному аргументу (ДВА, СЕРЬГИ), как два аргумента.

ответ

2

Правильный синтаксис, чтобы соответствовать конструкторами является

fun value (TWO s) = 2 
    | value (THREE s) = 3 

Или в данном случае, потому что вам не нужен костюм:

fun value (TWO _) = 2 
    | value (THREE _) = 3 
2

Это будет делать трюк:

fun value (TWO _) = 2 
    | value (THREE _) = 3 

Подчеркивание в шаблонах означает «Мне не важно это значение - я даже не буду называть его именем». TWO и THREE уже являются конструкторами, которые берут что-то типа suits - нам все равно что это точно.

Теперь, представляющие карты, подобные этому, не очень практичны - если вы хотите получить полную колоду карт, вам нужно будет создать тринадцатый тип конструктора и тринадцать предложений в вашей функции! Вместо этого, мы можем использовать целое:

type card = int * suits 

Или, если вы хотите, чтобы иметь конструктор, вы можете даже сделать:

datatype card = Card of int * suits 

Или вы могли бы изменить костюмы типа данных:

datatype suits = HEARTS of int 
       | DIAMONDS of int 
       ... 

И тогда value будет выглядеть следующим образом:

fun value (HEARTS n) = n 
    | value (DIAMONDS n) = n 
    ... 
Смежные вопросы