标准ml以自定义数据类型添加元素

时间:2012-03-28 08:51:22

标签: function types sml ml

我想为Standard ML中的新数据类型创建一个函数,数据类型名为intnest,定义如下:

datatype intnest = 
  INT of int
| LIST of intnest list;

我想创建一个在intlist中添加所有整数的函数,我尝试了以下代码:

fun addup (INT n) = n
  | addup (LIST x::xs) = x + addup(xs);

我做错了什么?

编辑:

我也尝试了以下内容:

fun addup (INT n) = n
  | addup (LIST x::xs) = addup(x) + addup(xs);

因此x的类型为INT,因此第一个选项返回其int值,而addup(xs)是递归调用以返回相同的第二个选项。

还尝试了以下内容:

fun addup (INT n) = n
  | addup (LIST []) = 0
  | addup (LIST x::xs) = addup(x) + addup(LIST xs);

但是我收到以下错误:

stdIn:146.4-151.50 Error: parameter or result constraints of clauses don't agree [tycon mismatch]
  this clause:      intnest list -> 'Z
  previous clauses:      intnest -> 'Z
  in declaration:
    addup =
      (fn INT n => n
        | LIST nil => 0
        | :: (<pat>,<pat>) => addup <exp> + addup <exp>)
stdIn:151.25-151.50 Error: operator and operand don't agree [tycon mismatch]
  operator domain: intnest
  operand:         intnest list
  in expression:
    addup x

1 个答案:

答案 0 :(得分:0)

首先,LIST案例中存在语法错误;摆脱of。您希望案例看起来像addup (LIST(x::xs)) = ...

更重要的是,addup中存在概念性问题。所需的addup类型似乎是intnest -> int。因此,有必要确保addup始终应用于intnest值并返回int值。

现在考虑列表x::xs的元素类型。您将其定义为LIST of intnest list,因此xintnest。但是在addup中,您将x视为整数。

同样,xsintnest list,但这不是intnest,这就是你在addup(xs)中所采用的方式。您的修订版本解决了x的问题,而不是xs的问题。您需要使用intnestxs发出LIST,这意味着您需要使用addup(LIST xs)

最后,你错过了一个案例。当你LIST []时会发生什么?

第三个版本不起作用,因为您缺少必需的括号。编译器告诉您,您正在使用intnest list作为其中一个案例(::案例)。也就是说,它将LIST x::xs视为(LIST x) :: xs

相关问题