2014-02-12 94 views
0

我该如何声明数据类型是另一种数据类型。 I.e在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的颜色值,但是当我匹配时,它不是问题。我将能够将两个HEARTS发送给像一个参数那样的函数,而不是像两个参数那样(TWO,HEARTS)。

回答

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 

模式中的下划线表示“我不关心这个值 - 我甚至不会给它起个名字”。 TWOTHREE已经是构造函数,它带有类型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 
    ...