【问题标题】:declare a datatype of a datatype in sml在 sml 中声明一个数据类型的数据类型
【发布时间】:2014-02-12 18:45:59
【问题描述】:

我想知道如何将数据类型声明为另一种数据类型。 即

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,但是当我匹配时,这不是问题。我将能够像一个参数而不是(TWO,HEARTS)像两个参数那样将两个心发送到一个函数。

【问题讨论】:

    标签: types sml


    【解决方案1】:

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

    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 类型的构造函数 - 我们不在乎 它到底是什么。

      现在,像这样表示卡片不太实用 - 如果您想要一副完整的卡片,您必须在函数中创建 13 个类型构造函数和 13 个子句!相反,我们可以使用整数:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-11
        • 2011-01-27
        • 2012-09-28
        • 2013-07-09
        • 1970-01-01
        相关资源
        最近更新 更多