Function 标准ml在自定义数据类型中添加元素
我想为标准ML中的新数据类型创建一个函数,该数据类型称为intnest,定义如下: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)
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在模式匹配时使用它来解构列表。这就是为什么错误消息中会出现:
的情况。