在sml中声明数据类型的数据类型

时间:2014-02-12 18:45:59

标签: types 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 个答案:

答案 0 :(得分:2)

匹配构造函数的正确语法是

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

或者在这种情况下,因为你不需要西装:

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

答案 1 :(得分: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
  ...