Function 标准ml在自定义数据类型中添加元素

Function 标准ml在自定义数据类型中添加元素,function,types,sml,ml,Function,Types,Sml,Ml,我想为标准ML中的新数据类型创建一个函数,该数据类型称为intnest,定义如下: datatype intnest = INT of int | LIST of intnest list; fun addup (INT n) = n | addup (LIST x::xs) = addup(x) + addup(xs); fun addup (INT n) = n | addup (LIST []) = 0 | addup (LIST x::xs) = addup(x)

我想为标准ML中的新数据类型创建一个函数,该数据类型称为intnest,定义如下:

datatype intnest = 
  INT of int
| LIST of intnest list;
fun addup (INT n) = n
  | addup (LIST x::xs) = addup(x) + addup(xs);
fun addup (INT n) = n
  | addup (LIST []) = 0
  | addup (LIST x::xs) = addup(x) + addup(LIST xs);
我想创建一个函数,将intlist中的所有整数相加,我尝试了以下代码:

fun addup (INT n) = n
  | addup (LIST x::xs) = x + addup(xs);
我做错了什么

编辑:

我还尝试了以下方法:

datatype intnest = 
  INT of int
| LIST of intnest list;
fun addup (INT n) = n
  | addup (LIST x::xs) = addup(x) + addup(xs);
fun addup (INT n) = n
  | addup (LIST []) = 0
  | addup (LIST x::xs) = addup(x) + addup(LIST xs);
因此x的类型是INT,因此第一个选项返回其INT值,而addup(xs)是一个递归调用,用于返回相同的第二个选项

还尝试了以下方法:

datatype intnest = 
  INT of int
| LIST of intnest list;
fun addup (INT n) = n
  | addup (LIST x::xs) = addup(x) + 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
stdIn:146.4-151.50错误:子句的参数或结果约束不一致[tycon失配]
此子句:intnest list->'Z
以前的子句:intnest->'Z
在声明中:
加总=
(fn INT n=>n
|列表nil=>0
|::(,)=>addup+addup)
stdIn:151.25-151.50错误:运算符和操作数不一致[tycon不匹配]
操作员域:intnest
操作数:intnest列表
在表达上:
相加x

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

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

现在考虑列表元素<代码> x::xs>代码>的类型。您将其定义为

LIST of intnest LIST
,因此
x
是一个
intnest
。但是在
addup
中,您将
x
视为一个整数

同样地,
xs
是一个
intnest列表
,但它不是一个
intnest
,这是您在
addup(xs)
中对待它的方式。您的修订版解决了
x
的问题,但没有解决
xs
的问题。您需要使用
LIST
xs
创建
intnest
,这意味着您需要使用
addup(LIST xs)

最后,你错过了一个案子。当您有
列表[]
时会发生什么


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

我不太理解你,xs不是一个intnest列表吗?@aizen92是的,它就是这样。但是
addup
需要的类型是
intnest
。您的
列表
案例是使用
intnest列表
实现的,但不是
intnest列表
。比较
xs
LIST xs
的类型可能会有所帮助。问题在于x::xs之间的括号,但我不太明白为什么x::xs不被认为是一个列表对象吗?@aizen92
是列表的类型构造函数,类似于
intnest
数据类型中的
LIST
INT
。SML在模式匹配时使用它来解构列表。这就是为什么错误消息中会出现
的情况。